2013-03-06 178 views
1

我開始使用Ruby on Rails,並且遇到關聯has_many :through的問題。Rails協會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’:現在

,提交一個新詞時,我收到以下錯誤字符串

哪我還挺想偏偏因事實上,對於給定的短語應該有很多template_pieces,但是我目前只能一次提交一個。所以它只是找到它,試圖遍歷它並失敗。

我該如何解決這個問題?將數據庫has_many :through輸入模型有沒有更好的方法?我是否必須手動執行此操作(如解除默認控制器@phrase = Phrase.new(params[:phrase])?

謝謝!

+0

有一個完整的堆棧跟蹤以及錯誤會很有幫助。 – adamdunson 2013-03-06 20:02:18

+0

以下是顯示的錯誤頁面: [page capture](https://www.dropbox.com/s/62dat91bx4dh2jg/error_msg.png?m) – snowingheart 2013-03-06 23:49:16

回答

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_fordocumentation

+0

該特定語法產生錯誤。 我嘗試刪除'collection_select'後的逗號,現在提交後,迴應如下: 'TemplatePiece(#70324553021400)expected,got Array(#10676920)'' – snowingheart 2013-03-06 23:25:32