2013-05-06 78 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 

正如你所看到的,我们简单地排除从父对象创建嵌套属性(从而消除了错误),然后手动后来添加。