2017-10-15 4 views
0

にネストされた属性の強力なパラメータを許可します新しいメモの作成は次のとおりです。正しい方法は、私は次のようにnote.rbという名前のモデルを持っているRailsの

<%= form_with scope: :note, url: notes_path, local: true do |f| %> 
    <p> 
    <%= f.label :title %><br> 
    <%= f.text_field :title %> 
    </p> 

    <p> 
    <%= f.label :description %><br> 
    <%= f.text_area :description %> 
    </p> 
    <%= f.fields_for :tags_attributes do |t| %> 
    <p> 
     <%= label_tag(:name, "Add a tag") %><br> 
     <%= t.text_field :name %> 

    </p>  

    <% end %> 

    <p> 
    <%= f.submit %> 
    </p> 
<% end %> 
<div id= "tag-displayer"> 
    <span id= "tags"></span> 
</div> 

メモのレコードを持つタグのレコードを作成しようとしています。私は

def create 
    @note = Note.new(note_params) 
    @note.user = current_user 
    if @note.save 
     redirect_to '/notes' 
    else 
     render 'new' 
    end   
end 

と持っている私のnotes_controller.rbで

TypeError (no implicit conversion of Symbol into Integer): 

私ならば、私は同じエラーを取得します。フォーム上

private 
    def note_params 
    params.require(:note).permit(:title, :description, tags_attributes: [:id, :name]) 
    end 

は、私は次のことを得る提出します使用:

params.require(:note).permit(:title, :description, :tags_attributes => [:id, :name]) 

私はエラーを取得する:

Unpermitted parameter: :tags_attributes 

私が使用している場合:フォームの

params.require(:note).permit(:title, :description, :tags_attributes => []) 

のparams提出:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"iSsLyOb0ZxZP0rfB4I5yfyrw965zJSLrtkroTUzseY2k4o5DwKpKXlyxN6p99pt4Fwju1RhMZPkbNdv+YVSESQ==", "note"=>{"title"=>"test note with Tag", "description"=>"Test note with tag", "tags_attributes"=>{"name"=>"Rails"}}, "commit"=>"Save Note"} 

私は私が間違ってやっているのかわからないです、私は私が利用できるすべての解決策を試しました。

Ruby 2.4.1でRails 5を使用する。

答えて

0

あなたのパラメータを見ると、実際には文字列があります。これを修正するにはいくつかの方法がありますが、私の意見では記号の代わりに文字列を使用するのが最も簡単な方法です。 tags_attributesについては、それは 'tags_attributes' => ...でなければなりません。私は正しく覚えているかどうかわかりません:それは 'title'または 'title'です。おそらく後者です。私は同じことが 'ノート'または 'ノート'になると思います。私はちょうどちょっと遊ぶことができ、それがどれであるか見ることができることを願っています。私は前にエラーがあったので、それを修正すべきであると確信しています。私が助けることを願っています!私が知って興味が、私はそれを固定する1お知らせください:)

+0

申し訳ありませんが、それをチェックアウトほとんどであるブログがあり:tags_attributes => [{id: "", name: ""}, {id: "", name: ""}]

のような配列形式でタグを送信するためのフロントエンドを変更してください私はまだ自分自身を学んでいます。私はとにかく助けることを願って – jj56723

+0

試してみました。それは動作しませんでした – user122121

+0

あなたは私にスタックトレースと完全なエラーメッセージを与えることはできますか?と行番号? – jj56723

0

さて私はあなたが

この試す

強いパラメータにIDを追加する必要はありませんだと思う: -

params.require(:note).permit(:title, :description, tags_attributes: [:name]) 
0

{..., "tags_attributes"=>{"name"=>"Rails"}}, ...} 

を、それが通過する必要がある場合:

{..., "tags_attributes"=>[{"name"=>"Rails"}], ...} # The hash is inside an array. 
012当面の問題は、フォームが通過しているということです

または可能性:

{..., "tags_attributes"=>{"any_key_except_id" => {"name"=>"Rails"}}, ...} 

私はいくつかの点で、ハッシュとして文字列"Rails"を治療しようとすると、それに"Rails"[:id]を呼び出そうとしていますおそらくことを、TypeErrorはその問題から来ているかなり確信しています。

(あなたの全体のセットアップを再現せずに)私の勘では、これは言うあなたのライン変更することで解決することができるということです:あなたはdocumentation for fields_forを見れば、それが使用する

<%= f.fields_for :tags do |t| %> 

<%= f.fields_for :tags_attributes do |t| %> 

を最終的には_attributesのない協会の名前です。 :tags_attributesでは、フォームは何をするべきか分からず、コレクションの代わりに単一のアイテムであると仮定し、配列の属性をネストしません。あなたはそれが(だけではなく、既存のタグの)新しいタグのためのフィールドを表示したい場合、私はあなたが保存されていないTagエンティティがでありますようにfields_for呼び出し前に@note.tags.buildどこかを呼び出す必要があります信じること

注意tagsコレクション。

0

あなたのモデルはhas_many :tagsと宣言されているモデルと、フォームデータはオブジェクト:tags_attributes => {id: "", name: ""}の中に入っています。

@note.saveのメモを保存しようとしているときや、@note = Note.new(note_params)を使用して初期化するときにエラーが発生する可能性がありますが、Strongパラメータが原因ではありません。強力なパラメータは、送信するフォームデータと一致するため、これらのパラメータを許可する必要があります。

は、あなたが直面している問題に類似正確でない場合、私はあることhttp://billpatrianakos.me/blog/2013/09/29/rails-tricky-error-no-implicit-conversion-from-symbol-to-integer/

関連する問題