1

我的应用程序具有以下结构。

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 Token Fieldskind_tokens中的描述使用

但是在编辑表单上,现在一切都完美显示了,我应该在 in的嵌套属性内data-pre的字段上的属性中预先填充数据。kind_tokenscodeexamples

RailsCast 说:

<%= f.text_field :author_tokens, "data-pre" => @book.authors.map(&:attributes).to_json %>

但我不能这样做@foo.examples.codes.kinds.map...,因为与Fooexamples返回一个集合的关系,与 . 的情况相同codes

我只是在使用:

<%= f.fields_for :codes do |codes_form| %>

那是里面

<%= f.fields_for :examples do |examples_form| %>

现在,如果我没有任何循环,并且一切都由nested_attributesand完成,我该如何预先填充代码类型fields_for

4

1 回答 1

0

解决了

每次使用

<%= f.fields_for ...

Rails 会自动生成 a 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

这就是我想出来的方式,但必须有另一种方式。

于 2012-06-07T15:59:08.473 回答