我在我的应用程序上有以下结构。
class Foo < ActiveRecord::Base
has_many :examples, :dependent => :destroy
accepts_nested_attributes_for :examples
end
class Example < ActiveRecord::Base
belongs_to :foo
has_many :codes, :dependent => :destroy
accepts_nested_attributes_for :codes, :reject_if => lambda { |a| a[:code].blank? }
end
class Code < ActiveRecord::Base
belongs_to :example
has_many :code_kinds
has_many :kinds, :through => :code_kinds
attr_reader :kind_tokens
def kind_tokens=(ids)
self.kind_ids = ids.split(",")
end
end
class CodeKind < ActiveRecord::Base
belongs_to :code
belongs_to :kind
end
class Kind < ActiveRecord::Base
has_many :code_kinds
has_many :codes, :through => :code_kinds
end
它非常适合具有创建和保存fields_for
的表单。
我正在使用 RailsCast #258 令牌字段中描述的kind_tokens
但是在编辑表单上,现在一切都完美显示,我应该在嵌套属性内的kind_tokens
字段中预填充data-pre
属性中的数据,以便在examples
中code
。
RailsCast说:
<%= f.text_field :author_tokens, "data-pre" => @book.authors.map(&:attributes).to_json %>
但我不能做@foo.examples.codes.kinds.map...
,因为与Foo
和examples
的关系返回一个集合,与codes
的情况相同。
我只是使用:
<%= f.fields_for :codes do |codes_form| %>
那是在里面
<%= f.fields_for :examples do |examples_form| %>
现在,如果我没有任何循环,并且一切都由nested_attributes
和fields_for
完成,我如何预填充代码的类型?
已解决
每次使用
<%= f.fields_for ...
Rails 会自动发出loop
,因此您可以在那里安装某种计数器,例如:
<%
@ctrEx = 0
@ctrCd = 0
%>
<%= form_for @foo ...
<%= f.fields_for :examples do |examples_form| %>
...
<%= examples_form.fields_for :codes do |codes_form| %>
...
<%= codes_form.text_field :kind_tokens, :class => "tag_matcher", "data-pre" => @foo.examples[@ctrEx].codes[@ctrCd].kinds.map(&:attributes).to_json %>
...
<%@ctrCd +=1%>
<%end%>
...
<%
@ctrEx += 1
@ctrCd = 0
%>
<%end%>
<%end%>
现在,您可以在data-pre
中使用计数器,如下所示:
@foo.examples[@ctrEx].codes[@ctrCd].kinds.map(&:attributes).to_json
这就是我想通的方法,但一定有另一种方法。