渡されたパラメータがソート可能なネストされたフォームから保存されない

だから、jquerysをソートしてネストされたフォームフィールドをソートしています。ソートされたときに送信するコントローラーメソッドは次のとおりです。

def sort_questions
  params[:questions_attributes].to_a.each_with_index do |id, index|
    question = Question.find(id)
    question.position = index + 1
    question.save(:validate => false)
  end
  render :nothing => true
end

Chromeのインスペクタを見て、渡されるパラメータは次のとおりです。

 "questions_attributes"=>{"1"=>{"content"=>"Where did you grow up?", "position"=>"", "_destroy"=>"false", "id"=>"2"}, "0"=>{"content"=>"What are you doing?", "position"=>"", "_destroy"=>"false", "id"=>"3"}}

以下は、呼び出されているjqueryソート可能な関数です:

  $('#questions').sortable({
    items:'.fields',
    placeholdet: true,
    axis:'y',
    update: function() {
      $.post("/templates/#{@template.id}/sort_questions?_method=post&" + $('.edit_template').serialize());
    }
  });

位置属性は保存されていません。 sort_questionsメソッドのさまざまなバリエーションを何度も何度も試してみました。

どんな助けも素晴らしいだろう。ありがとう!

完全なパラメータは次のとおりです。

"template"=>{"name"=>"Long Term Volunteer Opportunity", "description"=>"This template will be for opportunities that are for long term missionaries.", "default"=>"1", "questions_attributes"=>{"0"=>{"content"=>"What are you doing?", "position"=>"", "_destroy"=>"false", "id"=>"3"}, "1"=>{"content"=>"Where did you grow up?", "position"=>"", "_destroy"=>"false", "id"=>"2"}}}
0

2 答え

試してください:

 params[:template][:questions_attributes]
0
追加された
あなたは完全なパラメータを表示できますか?
追加された 著者 nodrog,
答えを少し修正した
追加された 著者 nodrog,
try params [:template] [:questions_attributes]、デバッガをparams [:questions_attributes] nilに置くとどうなりますか?申し訳ありませんが、私は入れ子になることについての部分を逃しました!私は私の答えを編集しました...
追加された 著者 nodrog,
既にそれを試しました...いいえ、dice.Butだから、私は question.save(:validate => false)を持っているので、検証をスキップします。
追加された 著者 Marc,
確かに params [:questions_attributes] ですが、今すぐ見ることができるように完全なパラメータを追加します。それは、 params [:questions_attributes] であり、 params [:questions] ではない、ネストされたフォームフィールドをソートしているからです。
追加された 著者 Marc,

これを少しでも軽視しなければならないかもしれませんが、私はカップルの潜在的な問題を見ています:

def sort_questions
  params[:questions_attributes].to_a.each_with_index do |id, index|
    question = Question.find(id)
    question.position = index + 1
    question.save(:validate => false)
  end
  render :nothing => true
end

@nodrogで述べたように、 params [:template] [:questions_attributes] である必要があります。現在、ループは決して実行されないように、 nil.to_a [] である params [:questions_attributes] 。それが終わると、ループ内の id は次のようになります:

[["0",{"content"=>"What are you doing?",...}], ... ]

これを find に渡すことはできません。以下のようなあまり知られていない構文を使用できます。

params[:template][:questions_attributes].to_a.each_with_index do |(id, attrs), index|
  question = Question.find(id)
  question.position = index + 1
  question.save(:validate => false)
end

次に、1.9 のハッシュがソートされていますが、フォーム要素からparamsハッシュ(デコードを含む)へのラウンドトリップは、ページの場合と同じ方法でソートされます each_with_index 戦略を許可します)。現在空白のクエリパラメータから "position" 属性を使用する必要があります。私はそのフィールドを並べ替えて人口を埋める百万の方法があると確信している、Googleはおそらくそれを行う方法の多くの情報を持っています。

最終的な関数は次のようになります:

params[:template][:questions_attributes].to_a.each_with_index do |(id, attrs), index|
  question = Question.find(id)
  question.position = attrs['position']
  question.save # the less validations you skip the better in the long run.
end
0
追加された
投稿の最後に追加した変更を確認してください。今それは適切に動作します。ありがとう!
追加された 著者 Marc,