- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在开发 Rails 3 应用程序时,我遇到了嵌套表单的问题。
一个集合是一组预定义的对象(使用 db:seed 创建)。另一个集合应该显示一个表单以允许选择一些元素。
示例比长描述更好,所以就在这里。
假设您有 2 个模型:用户和组。
假设有几个组:成员、管理员、访客……
您希望您的用户拥有多个组,因此您需要一个中间表:成员资格。
模型代码很明显:
class User < ActiveRecord::Base
has_many :memberships
has_many :groups, :through => :memberships
accepts_nested_attributes_for :memberships, :allow_destroy => true
end
class Membership < ActiveRecord::Base
belongs_to :user
belongs_to :group
end
class Group < ActiveRecord::Base
has_many :memberships
has_many :users, :through => :memberships
end
Controller 不需要更改。然而,该 View 更为复杂。
我想显示一个复选框列表来选择几组预定义的复选框。
我在这里使用特殊的_destroy
字段,具有相反的值,在实际未选中时销毁(因此在选中时将用户添加到组中)
%p
= f.label :name
%br
= f.text_field :name
%ul
= f.fields_for :memberships, @groups do |g|
%li
- group = g.object
= g.hidden_field :group_id, :value => group.id
= g.check_box :_destroy, {:checked => @user.groups.include?(group)}, 0, 1
= g.label :_destroy, group.name
但是,这并不能按预期工作,因为形式 g
将始终在每个组之后创建一个具有任意 id 的输入(甚至通过在 </li>
之后包含它来破坏布局):
<input id="user_memberships_attributes_0_id" name="user[memberships_attributes][0][id]" type="hidden" value="1" />
<input id="user_memberships_attributes_1_id" name="user[memberships_attributes][1][id]" type="hidden" value="2" />
# ...
了解嵌套属性的语法如下:
{:group_id => group.id, :_destroy => 0} # Create
{:group_id => group.id, :_destroy => 0, :id => membership.id} # Update
{:group_id => group.id, :_destroy => 1, :id => membership.id} # Destroy
{:group_id => group.id, :_destroy => 1} # Do nothing
每次id都发送是行不通的,因为它会尝试更新一条不存在的记录而不是创建它,当记录不存在时尝试销毁。
我找到的当前解决方案是删除所有 id,无论如何它们都是错误的(它们应该是成员资格的 id,而不是简单的索引),并在用户已经拥有该组时添加真实的 id。(这在创建和更新之前在 Controller 中调用)
def clean_memberships_attributes
if membership_params = params[:user][:memberships_attributes]
memberships = Membership.find_all_by_user_id params[:id]
membership_params.each_value { |membership_param|
membership_param.delete :id
if m = memberships.find { |m| m[:group_id].to_s == membership_param[:group_id] }
membership_param[:id] = m.id
end
}
end
end
这看起来太错误了,它在 Controller 中添加了很多逻辑,只是为了控制 View 的不良行为fields_for
helper 。
另一个解决方案是自己创建所有表单 html,尝试模仿 Rails 约定,并避免 id 问题,但这在代码中确实很吵,我相信有更好的方法。
fields_for
的方法吗?工作得更好吗?谢谢
最佳答案
我希望我理解正确吗?
组是预定义的,您希望能够将用户添加到组中。在编辑用户屏幕上,您将显示全部或部分预定义组。您想要通过勾选复选框并保存记录来添加用户。如果取消选中该复选框,则该用户在未选中组中的成员资格应该为零。
以下是我对公司和项目的做法:
Class Company
has_many :datasets
has_many :projects, :through => :datasets
Class Project
has_many :datasets
has_many :companies, :through => :datasets
<% for company in Company.all %>
<tr>
<td>
<%= check_box_tag 'project[company_ids][]', company.id, @project.companies.include?(company) %>
</td>
</tr>
<% end %>
我列出了所有公司并选中我想要包含在项目中的公司。
请告诉我这是否对您有帮助?我相信你在你的例子中使用 haml 。我不太习惯这种表示法。
如果您想使用子集,您可以使用范围:
scope :recent, Company.where(:created_at => (Time.now.midnight - 1.day)..Time.now.midnight)
然后你可以像 .all 方法一样使用这个作用域:
Company.recent
这有帮助吗?
关于ruby-on-rails - 如何正确编写具有 N-N 关系的嵌套表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3622312/
以下是一个非常简单的ruby服务器。 require 'socket' local_socket = Socket.new(:INET, :STREAM) local_addr = Socket.
我正在使用 OS X(使用 bash),并且是 unix 的新手。我想知道是否可以修改一些文件以便运行 ruby 程序,我不需要“ruby file.rb”,而是可以运行“ruby.rb”。 有理
我在用 Ruby 替换字符串时遇到一些问题。 我的原文:人之所为不如兽之所为。 我想替换为:==What== human does is not like ==what== animal does.
我想在一个循环中从 Ruby 脚本做这样的事情: 写一个文件a.rb(每次迭代都会改变) 执行系统(ruby 'a.rb') a.rb 将带有结果的字符串写入文件“results” a.rb 完成并且
我的问题是尝试创建一个本地服务器,以便我可以理解由我的新团队开发的应用程序。我的问题是我使用的是 Ruby 2.3.3,而 Gemfile 需要 2.3.1。我无法编辑 Gemfile,因为我被告知很
我有一个使用 GLI 框架用 Ruby 编写的命令行实用程序。我想在我的主目录中配置我的命令行实用程序,使用 Ruby 本身作为 DSL 来处理它(类似于 Gemfile 或 Rakefile)。 我
我的 Rails 应用 Controller 中有这段代码: def delete object = model.datamapper_class.first(:sourced_id =>
我正在寻找的解析器应该: 对 Ruby 解析友好, 规则设计优雅, 产生用户友好的解析错误, 用户文档的数量应该比计算器示例多, UPD:允许在编写语法时省略可选的空格。 快速解析不是一个重要的特性。
我刚开始使用 Ruby,听说有一种“Ruby 方式”编码。除了 Ruby on Rails 之外,还有哪些项目适合学习并被认可且设计良好? 最佳答案 Prawn被明确地创建为不仅是一个该死的好 PDF
我知道之前有人问过类似的问题,但是我该如何构建一个无需在前面输入“ruby”就可以在终端中运行的 Ruby 文件呢? 这里的最终目标是创建一个命令行工具包类型的东西。现在,为了执行我希望用户能够执行的
例如哈希a是{:name=>'mike',:age=>27,:gender=>'male'}哈希 b 是 {:name=>'mike'} 我想知道是否有更好的方法来判断 b 哈希是否在 a 哈希内,而
我是一名决定学习 Ruby 和 Ruby on Rails 的 ASP.NET MVC 开发人员。我已经有所了解并在 RoR 上创建了一个网站。在 ASP.NET MVC 上开发,我一直使用三层架构:
最近我看到 Gary Bernhardt 展示了他用来在 vim 中执行 Ruby 代码的 vim 快捷方式。捷径是 :map ,t :w\|:!ruby %. 似乎这个方法总是执行系统 Rub
在为 this question about Blue Ruby 选择的答案中,查克说: All of the current Ruby implementations are compiled to
我有一个 Ruby 数组 > list = Request.find_all_by_artist("Metallica").map(&:song) => ["Nothing else Matters"
我在四舍五入时遇到问题。我有一个 float ,我想将其四舍五入到小数点后的百分之一。但是,我只能使用 .round ,它基本上将它变成一个 int,意思是 2.34.round # => 2. 有没
我使用 ruby on rails 编写了一个小型 Web 应用程序,它的主要目的是上传、存储和显示来自 xml(文件最多几 MB)文件的结果。运行大约 2 个月后,我注意到 mongrel 进程
我们如何用 Ruby 转换像这样的字符串: 𝑙𝑎𝑡𝑜𝑟𝑟𝑒 收件人: Latorre 最佳答案 s = "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" => "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" s.u
通过 ruby monk 时,他们偶尔会从左侧字段中抛出一段语法不熟悉的代码: def compute(xyz) return nil unless xyz xyz.map {|a,
不确定我做错了什么,但我似乎弄错了。 问题是,给你一串空格分隔的数字,你必须返回最大和最小的数字。 注意:所有数字都是有效的 Int32,不需要验证它们。输入字符串中始终至少有一个数字。输出字符串必须
我是一名优秀的程序员,十分优秀!