4

記事を作成しようとしています。

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=
4

4 に答える 4

7

私はこの問題に数日間苦労しています。多くの検索を行いました..レールコンソールに移動し、スローされた例外を検索して、これを進める必要がありました。

なぜそれが起こっているのか、可能な回避策については、この質問に対するこの回答を確認してください。 Railsのネストされたモデルを使用して、外側のオブジェクトを*作成*し、同時に既存のネストされたオブジェクトを*編集*しますか?

ここで示した最初のオプションを使用すると、http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2010-3933 で説明されているようにセキュリティ ホールが作成されることに注意してください。

于 2013-06-26T10:06:36.050 に答える
4

呼び出しの 2 番目のパラメーターはfields_for不要のようです。ActiveRecord は、そのパラメーターに到達したときの関連付けでルックアップを実行していますが、articles_skillは新しく、まだ保存されていないため、ID がなく、エラーがトリガーされます。@article@article

<%= 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 %>
于 2013-05-06T13:32:10.393 に答える
1

回避策しか提案できません。それは機能しますが、私はそれが好きではありません-すぐに使えるソリューションが必要です.

私はあなたが機能を持っていると仮定します:

def
article_skill_params params.require(:articles_skill).permit(:description, :name, article_attributes: []) end

関数を追加する

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#create を変更します。

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

ご覧のとおり、ネストされたアトリビュートを親オブジェクトの作成から除外し (エラーを排除)、後で手動で追加します。

于 2016-07-19T13:06:20.563 に答える
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 %>
于 2013-05-06T14:09:29.923 に答える