1

Ruby on Rails を使い始めたところ、has_many :through関連付けに関する問題が発生しました。

私が使用しているモデルは次のとおりです。

class Phrase < ActiveRecord::Base
  attr_accessible :event_type_id, :template_pieces

  belongs_to :event_type
  has_many :phrases_pieces
  has_many :template_pieces, :through => :phrases_pieces
end

class TemplatePiece < ActiveRecord::Base
  attr_accessible :datatype, :fixed_text, :name

  has_many :phrase_pieces
  has_many :phrases, :through => :phrases_pieces
end

class EventType < ActiveRecord::Base
  attr_accessible :name

  has_many :phrases
end

class PhrasesPiece < ActiveRecord::Base
  attr_accessible :order, :phrase_id, :template_piece_id

  belongs_to :phrase
  belongs_to :template_piece
end

そして、デフォルトのフォームを次のように編集して、新しいフレーズを作成しようとしています。

<%= form_for(@phrase) do |f| %>
  <% if @phrase.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@phrase.errors.count, "error") %> prohibited this phrase from being saved:</h2>

      <ul>
      <% @phrase.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  Select the event type:
    <%= collection_select(:phrase, :event_type_id, EventType.all, :id, :name) %>
    Select the phrases to be used:
    <%= collection_select(:phrase, :template_pieces, TemplatePiece.all, :id, :name) %>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

attr_accessible :template_piecesMass Assignment で最初に問題が発生しましたが、フレーズ モデルにを追加して修正しました。それが正しい修正方法であるかどうかはわかりませんが、少なくとも、保護された属性を一括で割り当てることができないという不平を言うのをやめました.

現在、新しいフレーズを送信すると、次のエラーが表示されます。

「1」の未定義のメソッド「each」:文字列

これは、特定のフレーズに対して多くの template_pieces が存在するはずであるという事実が原因で発生すると思いますが、現在、一度に 1 つずつしか送信できません。そのため、それを見つけて、それを反復しようとして失敗します。

どうすればそれを修正できますか?has_many :throughを使用してモデルをデータベースに入力するより良い方法はありますか? 手動で行う必要がありますか (デフォルトのコントローラーを閉じる場合@phrase = Phrase.new(params[:phrase]など)?

ありがとう!

4

1 に答える 1

0

ヘルパーを使用してfields_for、ネストされた属性をラップする必要があります。

<%= f.fields_for :template_pieces do |template_f| %>
  <%= template_f.collection_select, :event_type_id, EventType.all, :id, :name %>
  Select the phrases to be used:
  <%= template_f.collection_select, :template_pieces, TemplatePiece.all, :id, :name %>
<% end %>

参照

fields_for ドキュメンテーション

于 2013-03-06T20:29:57.203 に答える