Ruby on rails 找不到ID为的项目的ID为1的ArticlesSkill=

Ruby on rails 找不到ID为的项目的ID为1的ArticlesSkill=,ruby-on-rails,nested-attributes,form-for,Ruby On Rails,Nested Attributes,Form For,我想写一篇文章 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,

我想写一篇文章

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_表单是@article表单对象的构建器

如果我试图保存@article对象,它将显示此错误

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

字段_中用于调用的第二个参数似乎没有必要。当@article到达该参数时,ActiveRecord正在执行@article的association articles\u 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 %>

如果您只是希望人们能够选择现有技能,那么您根本不需要嵌套属性,这对于您可能希望人们能够从创建文章的相同表单创建文章技能非常有用。您只需要将article\u skill\u 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 %>

我为这个问题挣扎了几天。做了大量的搜索。。需要转到rails控制台并通过抛出的异常进行搜索,才能在这方面取得任何进展

查看这个问题的答案,了解为什么会发生这种情况,以及可能的解决方法。


请注意,使用此处提供的第一个选项会造成安全漏洞,如中所述,我只能建议解决方法。它可以工作,但我不喜欢它-我想要一些现成的解决方案

我假设你有一个函数:

def set_article

  article_id = articles_skill_params[:article_attributes][:id]

  article = Article.find(article_id)

  @articles_skill.articles << article

  @articles_skill.save

end
def物品\u技能\u参数 参数要求:物品和技能。许可证:描述,:名称, 物品属性:[]结束

添加一个函数

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

如您所见,我们只需从父对象创建中排除嵌套属性,从而消除错误,然后稍后手动添加它们。

您尝试了什么?控制器代码?发送了参数的请求的前两行?
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