Ассоциации Rails has_many :through

Я начинаю работать с 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_pieces к модели фраз. Я не уверен, что это правильный способ исправить это, но, по крайней мере, он перестал жаловаться, что не может массово назначить защищенный атрибут.

Теперь я получаю следующую ошибку при отправке новой фразы:

неопределенный метод «каждый» для «1»: строка

Что, я думаю, происходит из-за того, что для данной фразы должно быть много template_pieces, но в настоящее время я могу отправлять их только по одному. Таким образом, он просто находит его, пытается пройти через него и терпит неудачу.

Как мне это исправить? Есть ли лучший способ ввода моделей с has_many :through в базу данных? Должен ли я делать это вручную (как при отключении контроллера по умолчанию @phrase = Phrase.new(params[:phrase])?

Спасибо!


person snowingheart    schedule 06.03.2013    source источник
comment
Было бы полезно иметь полную трассировку стека вместе с ошибкой.   -  person adamdunson    schedule 07.03.2013
comment
Вот отображаемая страница с ошибкой: захват страницы   -  person snowingheart    schedule 07.03.2013


Ответы (1)


Вы должны использовать помощник 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 документация.

person Harish Shetty    schedule 06.03.2013
comment
Этот конкретный синтаксис приводит к ошибке. Я попытался удалить запятую после collection_select, и теперь после отправки отвечает: TemplatePiece(#70324553021400) expected, got Array(#10676920) - person snowingheart; 07.03.2013