2013-05-06 77 views
3

ID = 1的文章我試圖創建一篇文章。找不到文章編號=

class Article < ActiveRecord::Base 

belongs_to :article_skill 
    attr_accessible :articles_skill_attributes 

    accepts_nested_attributes_for :articles_skill 
end 

class ArticlesSkill < ActiveRecord::Base 
    attr_accessible :description, :name 

    has_many :articles 

end 

這是我在article/new.html.erb

<%= article_form.fields_for :articles_skill, @article.articles_skill do |b|%> 
    <label class="medium"><span class="red">*</span> Skill</label> 
    <%= b.select :id, options_for_select(ArticlesSkill.all.collect{|m| [m.name, m.id]}) %> 
    <%end%> 

形式在這裏article_form對於@article窗體對象的建設者。

如果我嘗試保存@article對象,則顯示此錯誤。

Couldn't find ArticlesSkill with ID=1 for Article with ID= 
+0

你有什麼試過?控制器代碼?請求的前兩行(帶有發送的參數)? – fotanus 2013-05-06 13:28:40

回答

4

您的fields_for調用中的第二個參數似乎沒有必要。 ActiveRecord在達到該參數時對@article執行關聯articles_skill的查找,但由於@article是新的且尚未保存,因此它沒有ID並觸發錯誤。

<%= article_form.fields_for :articles_skill do |b|%> 
<label class="medium"><span class="red">*</span> Skill</label> 
<%= b.select :id, options_for_select(ArticlesSkill.all.collect{|m| [m.name, m.id]}) %> 
<% end %> 
0

如果你只是希望人們能夠選擇一個現有的技能,你根本就不需要嵌套的屬性(這是因爲當你可能希望人們能夠從相同的形式創建項目的技能很有用創建一篇文章)。你只是想設置article_skill_id到現有的價值,所以你可以做

<%= form_for(@article) do |f| %> 
    ... 
    <label class="medium"><span class="red">*</span> Skill</label> 
    <%= f.select :article_skill_id, ArticlesSkill.all.collect{|m| [m.name, m.id]}) %> 
<% end %> 
1

我可以建議只是一種變通方法描述的安全漏洞。它有效,但我不喜歡它 - 我想要一些開箱即用的解決方案。

我假設你有一個函數:

DEF articles_skill_params
params.require(:articles_skill).permit(:說明,:姓名, article_attributes:[])端

添加功能

def articles_skill_params2 
    params.require(:articles_skill).permit(:description, :name) 
end 

添加另一個功能:

def set_article 

    article_id = articles_skill_params[:article_attributes][:id] 

    article = Article.find(article_id) 

    @articles_skill.articles << article 

    @articles_skill.save 

end 

更改ArticlesSkillController#創建:

def create 

    @articles_skill = ArticlesSkill.new(articles_skill_params2) 
    set_article 

    respond_to do |format| 
     if @articles_skill.save 
     format.html { redirect_to @articles_skill, notice: 'Article skill was successfully created.' } 
     format.json { render :show, status: :created, location: @articles_skill } 
     else 
     format.html { render :new } 
     format.json { render json: @articles_skill.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

正如你所看到的,我們簡單地排除從父對象創建嵌套屬性(從而消除了錯誤),然後手動後來添加。