1

我無法弄清楚如何使用has_many:through關係創建嵌套窗體。我使用了這個,我看着this tutorial以及Stack Overflow和Google其他地方的許多問題。使用has_many在Rails中嵌套窗體:通過

我想通過文章窗體創建標籤的方法。我的代碼已經通過大量基於從許多不同的來源,其中沒有一個信息反覆的去工作過,但現在我有

一種物品

class Article < ActiveRecord::Base 
    attr_accessible :content, :heading, :image, :tag_ids, :tags, :tag_name, :tag_attributes 

    belongs_to :user 
    has_many :comments, :dependent => :destroy 
    has_many :article_tags 
    has_many :tags, :through => :article_tags 
    accepts_nested_attributes_for :tags, :reject_if => proc { |attributes| attributes['tag_name'].blank? } 
... 
end 

一種標籤類類

class Tag < ActiveRecord::Base 
    attr_accessible :tag_name 

    has_many :article_tags 
    has_many :articles, :through => :article_tags 
end 

一種article_tags

class ArticleTag < ActiveRecord::Base 
    belongs_to :article 
    belongs_to :tag 
end 

新在我的文章類s_controller.rb是這樣的:

def new 
    @article = Article.new 
    @tags = Tag.find(:all) 
    article_tag = @article.article_tags.build() 
    @article_tags = @article.tags.all 
    @article.article_tags.build.build_tag 
    3.times do 
     article_tag = @article.article_tags.build() 
    end 
end 

而我的文章的形式是目前這樣的(我已經來回嵌套fields_for之間:標籤fields_for內:article_tags或只是讓他們對自己) :

<%= form_for @article , :html => { :multipart => true } do |f| %> 
...excerpted... 
<%= f.fields_for :article_tags do |t| %> 
    <%= t.fields_for :tags do |ta| %> 
    <%= ta.label :tag_name, "Tag name" %> 
    <%= ta.text_field :tag_name %> 
    <% end %> 
<% end %> 

我意識到這可能是凌亂的;我很新,我試圖弄清楚。我必須添加任何東西articles_controller創建?這是否與attr_accessible有關?或者我應該做一些完全不同的事情?

編輯:

下面是製作由HCK建議的變化,創造了新的文章,與TAG_ID 3選擇現有的標籤,並試圖在同一時間也創造了一個新的標籤後,請求參數:

已啓動POST「/ articles」for 127.0.0.1 at 2011-08-10 19:05:46 +1000 通過ArticlesController處理#以HTML格式創建 參數:{「utf8」=>「✓」,「authenticity_token」= >「5CQuV4RWfFZD1uDjv1DrZbIe + GB/sDQ6yiAETZutmZ4 =」,「article」=> {「heading」=>「Test heading」,「content」=>「Test Content」,「tag_ids」=> [「3」],「article_tags」 => {「tags」=> {「tag_name」=>「Test tag」}}},「commit」=>「提交」 } 用戶負載(0.2ms)選擇「用戶」。 SELECT「tags」。* FROM「tags」WHERE「tags」。「id」= 3 LIMIT 1 AREL(0.4ms)INSERT INTO「articles」(「content」,「user_id」,「created_at」,「updated_at」, ('Test Content',1,'2011-08-10 09:05:46.228951','2011-08-10 09:05:46.228951') ,'Test heading',NULL,NULL,NULL) AREL(0.2ms)INSERT INTO「article_tags」(「article_id」,「tag_id」,「created_at」,「updated_at」)VALUES(88,3,'2011-08 -10 09:05:46.243076','2011-08-10 09:05:46.243076') [回形針]保存附件。 重定向到212ms

找到[本地主機] 完成302如果我補充:article_tags到attr_accessible的文章,然後再試一次,我得到:

開始POST 「/篇」 爲127.0.0。1 at 2011-08-10 19:11:49 +1000 通過ArticlesController進行處理#創建爲HTML 參數:{「utf8」=>「✓」,「authenticity_token」=>「5CQuV4RWfFZD1uDjv1DrZbIe + GB/sDQ6yiAETZutmZ4 =」,「文章「=> {」heading「=>」Test heading「,」content「=>」Test content「,」tag_ids「=> [」3「],」article_tags「=> {」tags「=> {」tag_name 「=>」Test tag「}}},」commit「=>」Submit「} 用戶負載(0.2ms)SELECT」users「。* FROM」users「WHERE」users「。」id「= 1 LIMIT 1 標籤加載(0.4ms)SELECT「tags」。* FROM「tags」WHERE「tags」。「id」= 3 LIMIT 1 已完成119ms

ActiveRecord :: AssociationTypeMismatch(ArticleTag(#2165285820)expected,got Array (#2151973780)): app/controllers/articles_controller.rb:32:在`create'

回答

0

嘗試在您的控制器的操作中將@article.article_tags.build.build_tag替換爲@article.tags.build

+0

謝謝你,但它仍然沒有奏效。它會創建沒有錯誤的新文章,但不會創建或分配新標籤。 – Kelly

+0

提交表單後,發送請求參數。 – Hck

+0

我編輯了我的問題;讓我知道如果你不是你正在尋找的東西。謝謝參觀。 – Kelly

0

我不認爲你必須在其中嵌套文章標籤。文章標籤只是文章和標籤之間的關聯。您可以簡單地在文章中創建新標籤,因爲您已經與其關聯。我相信這是來自「accepted_nested_attributes」的魔力。嘗試這個。

<%= form_for @article , :html => { :multipart => true } do |f| %> 
...excerpted... 
    <%= f.fields_for :tags, Tag.new do |t| %> 
    <%= t.label :tag_name, "Tag name" %> 
    <%= t.text_field :name %> 
    <% end %> 
<% end %> 

此外,你應該嘗試質量分配它,而不是通過使用私人蔘數一塊一塊地保存每個屬性。我也有一個嵌套的表單問題,所以你可以看看我如何寫我的代碼: Cannot save record to database RAILS nested forms

我唯一留在那裏的是私人蔘數部分,我建議你做。

private 
    def venue_params 
     params.require(:venue).permit(:name, :address, :discount, :latitude, :longitude, :tags_attributes =>[:name],:tag_ids => []) 
    end 

我也寫了一篇博客文章嵌套形式,所以你可以在它看一看太

http://minling.github.io/