-1

編集可能な約 40 のフィールドを持つフォームを作成しました。コントローラーを使用してそれらをデータベースに保存しようとしています。私は現在、このコードを持っています:

c = Form.find(params[:id])
  if c
    params.each do |k,v|
    c.k = params[:v]
  end

これは機能しません。次のエラーが表示されます。undefined method 'k='

それらをすべて手動で書き出すとしたら、次のようになります。

c = Form.find(params[:id])
if c
  c.title = params[:title]
  c.reference = params[:reference]
....
etc.
4

3 に答える 3

1

Formに渡されるものに基づいてレコードの属性を更新しようとしていると仮定するとparams、基本的なアウトラインとしてこれを試してください。

c = Form.find_by_id(params[:id])
if c
    params.each do |k, v|
        c[k] = v
    end

    c.save!
end

元のコードでの の使用は、params[:v]おそらく意図したとおりではなく、代わりにそうするつもりでしたparams[:k]。ただし、実際には、ループ内でそのキーの値を調べる必要はありません。なぜなら、既に手元に値があるからですv

ActiveRecord属性を操作する方法について簡単に説明します: http://www.davidverhasselt.com/2011/06/28/5-ways-to-set-attributes-in-activerecord/

于 2013-03-22T12:49:55.200 に答える
0

私はあなたが何をしようとしているのかわかりませんが、あなたのコードは非常に奇妙なようです。解決策は次のとおりです

c.send "#{k}=", params[:v]
于 2013-03-22T12:34:23.430 に答える
0

どうですか

c = Form.find(params[:id])
c.update_attributes(params[:form])

2行目の部分を推測したことに注意して[:form]ください。これは、フォームによって異なります。HTMLソースをチェックし、フィールドが次のようになっているかどうかを確認します。

<input name="form[field_name]" ...

ご覧のとおり、名前には「配列のような」形式が含まれています。HTMLソースを確認し、適応させます(したがって、その場合はname="foo[field_name]"、を使用する必要がありますc.update_attributes(params[:foo])

于 2013-03-22T12:50:05.773 に答える