2013-03-06 3 views
1

Я начинаю с Ruby on Rails, и я столкнулся с проблемой ассоциации has_many :through.Ассоциации рельсов has_many: через

модели я использую является:

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“: String

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

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

Спасибо!

+0

Было бы полезно иметь полную трассировку стека вместе с ошибкой. – adamdunson

+0

На странице ошибки отображается: [page capture] (https://www.dropbox.com/s/62dat91bx4dh2jg/error_msg.png?m) – snowingheart

ответ

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

Reference

fields_fordocumentation.

+0

Этот конкретный синтаксис дает ошибку. Я попытался удалить запятую после 'collection_select', а теперь, после отправки, отвечает: ' TemplatePiece (# 70324553021400) ожидается, получил Array (# 10676920) ' – snowingheart

Смежные вопросы