1

この SO answer未定義メソッド `stringify_keys!' では ruby on railsで、OP は「Honda」文字列を使用して新しい車のオブジェクトを作成しようとしました。

 @car = Car.new(params[:car])

キーの文字列化エラーが発生しました。回答者は、オブジェクトを作成するときにテーブルから列 (この場合は「名前」列) を指定する必要があると述べました。

create expects to get an attributes hash and to stringify it's keys for the column names.

If you have a column named name in your cars table then try this:

@car = Car.new(:name => params[:car])

ただし、Rbates が「name」文字列と列「winner」をブール値として含むエントリ テーブルを作成する RailsCast を見ています。彼のコントローラー (json で応答するように設定されています) では、属性ハッシュを使用していません。彼の作成アクション

   def create
     respond_with Entry.create(params[:entry])
   end

Rbates が属性ハッシュを使用する必要がなかったのはなぜですか? また、使用できるとしたら、その属性ハッシュはどのようになりますか? このようなもの?ryans の場合、:name と :winner のように、すべての列に名前を付ける必要がありますか?

   def create
     respond_with Entry.create(:name => params[:entry][:name], :winner => params[:entry]     [:winner]
   end
4

2 に答える 2

1

それはすべて、何params[:car]が含まれているかによって異なります。Railscast の例では、 は 2 つのエントリ (と)params[:car]を含むハッシュです。他の SO の質問では、車の名前を含む文字列のように見えます。namewinnerparams[:car]

Car.new は常にハッシュを期待します。単一の値を渡したい場合は、渡す値を Car.new に伝えるキーを持つハッシュに変換する必要があります。

于 2013-01-09T00:01:23.637 に答える
0

前の質問で、params[:car] は文字列でした。Rails のnewcreateメソッドはどちらもハッシュを想定しているため、コードを変更して渡すようにしました:name => params[:car]

Rails の form_for を使用してフォームを作成する場合、params[:model_name] にはモデル属性に一致するキーを持つハッシュが含まれます。その場合、カスタム作業は必要なく、params[:model_name] でモデルを初期化するだけで問題なく動作します。

于 2013-01-08T23:59:37.703 に答える