Я начинаю работать с 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]
)?
Спасибо!