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_attributesループがなく、すべてがandによって行われている場合、コードの種類を事前に入力するにはどうすればよいfields_forですか?

4

1 に答える 1

0

解決済み

を使用するたびに

<%= 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

それが私が考え出した方法ですが、別の方法があるはずです。

于 2012-06-07T15:59:08.473 に答える