6

更新:ここで回答しました

こことインターウェブには、nested_form、collection_select、accepts_nested_attributes_for、fields_forをうまく連携させるための良い質問と回答がたくさんありますが、それでも困惑しています。よろしければ、よろしくお願いします。

目的:新しいisbnレコードを生成します。isbnには多くの貢献者がいる可能性があります。必要に応じて、 ryanbnested_form gemを使用して、フォームに新しい寄稿者フィールドを動的に生成しています。これらのフィールドの1つは、Contributorのすべての名前レコードのcollection_selectドロップダウンを使用します。新しいレコードが作成されると、多くのコントリビューターIDを結合テーブル(contributors_isbns)に書き込む必要があります。

私はこれを少しは機能させていますが、isbnsテーブルの新しいレコードに単一の寄稿者IDを保存できるところまでです。結合テーブルにデータを書き込むことができないようです。

私は3つのモデルを持っています。寄稿者とIsbnsには多対多の関係があり、これはhas_many:throughを使用して行いました。isbnには多くの寄稿者を含めることができ、寄稿者には多くのisbnを含めることができます。それらはcontributors_isbnを介して参加します。

isbn.rb

  attr_accessible               :contributor_id
  has_many                      :contributors, :through => :contributors_isbns
  has_many                      :contributors_isbns
  accepts_nested_attributes_for :contributors
  accepts_nested_attributes_for :contributors_isbns

contributor.rb

  attr_accessible               :isbn_id
  has_many                      :contributors_isbns
  has_many                      :isbns, :through => :contributors_isbns
  accepts_nested_attributes_for :isbns

contributors_isbn.rb

  class ContributorsIsbn
  attr_accessible               :isbn_id, :contributor_id
  belongs_to                    :isbn
  belongs_to                    :contributor
  accepts_nested_attributes_for :contributors

isbnsコントローラーの場合:

 def new
    @isbn  = Isbn.new
    @title = "Create new ISBN"
    1.times {@isbn.contributors.build}
    @isbn.contributors_isbns.build.build_contributor
  end

(明らかに、どのビルド方法を使用するかを決めることはできません。)

isbns new.html.erbビューで:

<%= nested_form_for @isbn, :validate => false do |f| %>
<h1>Create new ISBN</h1>
<%= render 'shared/error_messages', :object => f.object %>
<%= render 'fields', :f => f %>
  <div class="actions">
    <%= f.submit "Create" %>
  </div>  

<% end %>

_fields部分では、非常にプレーンなtext_fieldを持つバージョン:

<%= field_set_tag 'Contributor' do %>
<%= f.link_to_add "Add Additional Contributor", :contributors %>
<li>
<%= f.label 'Contributor Sequence Number' %>
<%= f.text_field :descriptivedetail_contributor_sequencenumber%>
</li>

<%= f.fields_for :contributors_isbns, :validate => false do |contrib| %>
<li>
<%= contrib.label :id, 'contributors_isbns id' %>
<%= contrib.text_field :id %>
</li>
<% end %>

<li>
<%= f.label 'Contributor Role' %>
<%= f.text_field :descriptivedetail_contributor_contributorrole  %>
</li>

<% end %>

そして、ここでは、どちらも機能しないより洗練されたバージョン:

<%= f.fields_for :contributors_isbns, :validate => false do |contributors| %>
<li>
<%= f.label :personnameinverted, 'Contributor Name' %>
<%= f.collection_select(:contributor_id,  Contributor.all, :id, :personnameinverted ) %>
</li>
<% end %>

このコードはここからの答えを使用します。どちらも、行に「Missingblock」エラーが発生しますnested_form_for @isbn

よろしくお願いします。

更新:この種の問題を調べるのに役立つ可能性のあるnested_formgemに関する情報を次に示します。そして、accepts_nested_attributes_forに関する[2009年だがまだ関連性のある投稿][4]があります。

更新2:まあ、ここにあります。私は、collection_selectやhas_many throughを使用せずに、単純なbelongs_to / has_manyの関連付けを使用して、2つの異なるモデルでこれの縮小版を調べてきました。親モデルはContractであり、子モデルはIstcです。ネストされたフォームからレコードを作成することすらできませんでした。ただし、スタックを調べて「警告。保護された属性を一括割り当てできません」というエラーメッセージをグーグルで検索した後:istcs_attributes、行に追加したばかりで:attr_accessible、レコードを追加できるようになりました。かなり重要なビットが欠落しており、RTFMの場合は、gemreadmeにあります。後で更新して、これが関連付けを通じてより複雑なhas_manyで機能するかどうかを確認します。

更新4:[ここ] [5]は、nilレコードのエラーメッセージを処理する方法に関するもう1つの便利な投稿です。

更新5:わずかな迂回-フォームに新しいフィールドのセットを動的に追加すると、子レコードの1つが作成されていました。Duh-子フォーム領域内に「追加」リンクがありました。これが前です:

<%= f.fields_for :istcs do |istc_form| %>
<h4> Istc</h4>
<%= istc_form.label "istc name" %>
<%= istc_form.text_field :title_title_text %>
<%= istc_form.link_to_remove "[-] Remove this istc"%>
<%= f.link_to_add "[+] Add an istc", :istcs  %>
<% end %>

そしてここに後があります:

<%= f.fields_for :istcs do |istc_form| %>
<h4> Istc</h4>
<%= istc_form.label "istc name" %>
<%= istc_form.text_field :title_title_text %>
<%= istc_form.link_to_remove "[-] Remove this istc"%>
<% end %>
<%= f.link_to_add "[+] Add an istc", :istcs  %>

更新6、回答後:

ああ、いや。collection_selectが機能していません。コントリビューターモデルの既存のレコードを使用せずに、新しいコントリビューターレコードを追加します。他の誰かもこの問題を抱えていました。何か案は?

4

1 に答える 1

3

ハザ!これがすべてを機能させるコードです。少し冗長ですが、何も除外したくありませんでした。私の主な学習:

  • 親モデルで子属性attr_accessibleを作成する必要があります

  • 結合テーブルモデルで親IDと子IDをattr_accessibleにする必要があります

  • 親コントローラーで少なくとも1つの子インスタンスを作成すると、作業が楽になります。

contributor.rbモデル

class Contributor < ActiveRecord::Base
  attr_accessible  #nothing relevant 
  has_many :contributors_isbns
  has_many :isbns, :through => :contributors_isbns

isbn.rbモデル

class Isbn < ActiveRecord::Base
  attr_accessible :contributors_attributes, :contributor_id, :istc_id #etc
  belongs_to  :istc
  has_many   :contributors, :through => :contributors_isbns
  has_many   :contributors_isbns
  accepts_nested_attributes_for :contributors #if you omit this you get a missing block error

contributors_isbnモデル

class ContributorsIsbn < ActiveRecord::Base
  belongs_to :isbn
  belongs_to :contributor
  attr_accessible :isbn_id, :contributor_id

isbnコントローラー

 def new
    @isbn  = Isbn.new
    @title = "Create new ISBN"
    1.times {@isbn.contributors.build}
  end

new.html.erb

<td class="main">
<%= nested_form_for @isbn, :validate => false do |f| %>
<h1>Create new ISBN</h1>
<%= render 'shared/error_messages', :object => f.object %>
<%= render 'fields', :f => f %>
  <div class="actions">
    <%= f.submit "Create" %>
  </div>  

<% end %>

_fields.html.erb

<%= field_set_tag 'Identifier Details' do %>

<li>
<%= f.label 'Title prefix' %>
<%= f.text_field :descriptivedetail_titledetail_titleelement_titleprefix %>
</li>
<li>
<%= f.label 'Title without prefix' %>
<%= f.text_field :descriptivedetail_titledetail_titleelement_titlewithoutprefix %>
</li>
<li>
<%= f.label 'ISTC' %>
<%= f.collection_select(:istc_id, Istc.all, :id, :title_title_text, :prompt => true) %>
</li>

<% end %>


<%= field_set_tag 'Contributor' do %>
<li>
<%= f.label 'Contributor Sequence Number' %>
<%= f.text_field :descriptivedetail_contributor_sequencenumber%>
</li>

<%= f.fields_for :contributors, :validate => false do |contributor_form| %>
<li>
<%= contributor_form.label :personnameinverted, 'Contributor Name' %>
<%= contributor_form.collection_select(:isbn_id, Contributor.all, :id, :personnameinverted ) %>
</li>
<%= contributor_form.link_to_remove "[-] Remove this contributor"%>
<% end %>
<%= f.link_to_add "[+] Add a contributor", :contributors  %>


<li>
<%= f.label 'Contributor Role' %>
<%= f.text_field :descriptivedetail_contributor_contributorrole  %>
</li>

<% end %>
于 2011-06-08T11:36:58.327 に答える