5
  • モデル「問題」とネストされたモデル「関係」があります
  • issue.rb で次のように述べました。

    has_many :relationships, :dependent => :destroy
    accepts_nested_attributes_for :relationships, :allow_destroy => true
    
  • relationship.rb で私は言及しました:

    belongs_to :issue
    
  • Ryan Bates Railcast#196 に従って、issues_controller に次のものがあります。

    relationship = @issue.relationships.build
    

ただし、「不明な属性: 関係」というエラーが発生します。

ここで何か間違ったことをしていますか?リレーションシップ属性がログでサーバーに渡されていることを確認できますが、このエラーにより作成が成功しません。

私の Rails の専門知識は初心者レベルです。

助けてくれてありがとう。

編集:関連するコントローラーコード:

    @relationship = @issue.relationships.build
    #@relationship = Relationship.new(params[:relationship])
    if @relationship.issue_id = ''
      @relationship.issue_id = @issueid
    end

    if @relationship.cause_id = ''
      @relationship.cause_id = @issueid
    end

    @relationship.save
    redirect_to(:back, :notice => 'New Relationship was created') 

トレースに表示される内容:

    ActiveRecord::UnknownAttributeError in IssuesController#create
    unknown attribute: relationship

Issue パラメーターの中で、Relationship パラメーターが期待どおりに渡されていることがわかります。

    "relationship"=>{"issue_id"=>"100",
    "cause_id"=>""}

別の更新 form_for コードの投稿:

    - form_for Issue.new do |f|

      .field  
        = f.text_field :description, :class=>"formfield", :id=>"frm_descr"

      .field  
        = f.hidden_field :wiki_url, :class=>"formfield", :id=>"frm_wiki_url"

      .field
        = f.hidden_field :short_url, :class=>"formfield", :id=>"frm_img_url"

      .field
        = f.hidden_field :title, :class=>"formfield", :id=>"frm_title"         

      = f.fields_for :relationship do |builder|
        = builder.text_field :issue_id, :class=>"form_field", :id=>"frm_rel_issue_id", :value=>@issue.id 
        = builder.text_field :cause_id, :class=>"form_field", :id=>"frm_rel_cause_id"

      .actions
        = f.submit 'Create', :class=>"save_button", :name=>"save_issue_rel_button", :id=>"val_collector"
4

4 に答える 4

9

この行を変更します

= f.fields_for :relationship do |builder|

これに:

= f.fields_for :relationships do |builder|

あなたの問題はhas_many関係-複数形です。これにより、正しいrelationships_attributesパラメーターが得られます。

于 2011-07-27T11:35:32.860 に答える
4

これが動作するスケルトンコードです。新しいプロジェクトを作成し、他の回答の組み合わせを試して、最終的に動作するようにしました。

これが私の解決策です。その後、注意すべき点があります。私はさまざまなモデルを使用していますので、ご容赦ください。

  • 私のモデルは:ディスカッションhas_many postsです。
  • ディスカッションには属性がありません。
  • 投稿には content:text と Discussion_id:integer があります。

作業コード

(モデル)discussion.rb

has_many :posts
accepts_nested_attributes_for :posts

(モデル) post.rb

belongs_to :discussion

ルート.rb

resources :discussions do
  resources :posts
end

(ディスカッション ビュー) _form.html.erb

<%= form_for(@discussion) do |f| %>
  <%= f.fields_for :posts, @post do |p| %>
    <%= p.text_area :content %>
  <% end %>
  <%= f.submit %>
<% end %>

(コントローラ)discussions_controller.rb

  def new
    @discussion = Discussion.new
    @post = @discussion.posts.build

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @discussion }
    end
  end

  def create
    @discussion = Discussion.new(params[:discussion])

    respond_to do |format|
      if @discussion.save
        format.html { redirect_to(@discussion, :notice => 'Discussion was successfully created.') }
        format.xml  { render :xml => @discussion, :status => :created, :location => @discussion }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @discussion.errors, :status => :unprocessable_entity }
      end
    end
  end

うまくいかない可能性のあること

最初に、Thilo は正しかったです。不明な属性を取得します。

# WRONG!
f.fields_for :post

次に、新しいアクションで @post インスタンス変数を使用する必要があります。そうしないと、post.context テキストエリアが表示されません。

# REQUIRED!
@post = @discussion.posts.build

3 番目に、f.fields_for @postを使用すると、create アクションは不明な属性を訴えます: postも。

# WRONG!
f.fields_for @post do |p|

代わりにこれを使用してください:

# RIGHT!
f.fields_for :posts, @post  do |p|

終わり

そうですね、これに関するドキュメントをもっと見たいと思います (有用なものは見当たりません)。たとえば、form_for [@discussion, @post] を使用しているのを見たことがありますが、それを機能させることはできません。

于 2011-07-28T06:54:55.087 に答える
0

accept_nested_attributes を使用して、setter メソッド relationship_attributes= を作成しました。

変更する必要があることに気づいたことがいくつかあります。

設定する必要はありません

@relationship = @issue.relationships.build

フォームは次のようになります (f.fields_for :relationship があります)。

= form_for @issue do |f|

  # your issue fields here

  = f.fields_for :relationships do |r|

    # your relationship fields here

ここでの利点は、ID などを設定する必要がないことです。

于 2011-07-27T03:50:28.677 に答える
0

コントローラーで関係を構築し、それをビューで使用しようとしていると思います。これを表示するには、インスタンス変数にする必要があります。必要なことは、 の名前の from に @ 記号をrelationship入れるだけです@issue

@relationship = @issue.relationships.build

編集:元の質問が尋ねられた後にOPによって提供された詳細情報により、この回答は明らかに適用されなくなりました。

于 2011-07-27T00:55:41.567 に答える