3

Ruby on Rails のモデルについて質問があります。

Rails には、列の名前とその列の新しい値を受け取る次のメソッドがあります。

def change_attribute
    field = params[:field]
    new_value = params[:new_value]
    person = Person.find(params[:id])
    person.update_attribute(field, new_value)
    render :text=>"", :layout=>false
end

しかし、これは私にエラーをスローします:そのフィールドは存在しません.私はそれが:name、:lastnameなどのようなものであるべきだと思います.

この関数を機能させるために、フィールド変数を動的にそれらの1つに変換するにはどうすればよいですか?

4

1 に答える 1

2

取得したフィールド名が元のフィールド名とまったく同じかどうかを確認する必要がありますparams[:field](余分なスペースなどはありません)。puts params[:field].inspectターミナル(レールサーバーが起動されている場所)で確認して確認できます。

update_attributeのドキュメントによると、フィールド名として文字列または記号を渡すことができます。したがって、フィールド パラメータを に渡す前にシンボルに変換することについて心配する必要はありませんupdate_attribute。ご覧のとおり、ソースは次のとおりです。

def update_attribute(name, value)
  name = name.to_s
  raise ActiveRecordError, "#{name} is marked as readonly" if self.class.readonly_attributes.include?(name)
  send("#{name}=", value)
  save(:validate => false)
end

最初に文字列に変換され、次にセッターが呼び出されます。@jdoe が述べたように、モデルを検証していないため (save(:validate => false)コードの行を参照)、このメソッドを使用する場合は注意する必要があります。

于 2012-05-25T07:21:14.003 に答える