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