0

モデルがあり、このモデルには名前がステータスである属性があります。ステータスの検証は次のとおりです。

validates_inclusion_of :status, :in => [:nil, :new, :old], :message => "......"

モデルの編集フォームを作成します。これが選択入力です。

 =f.select :status, [["New Record", :new], ["Old Record", :old]], {:include_blank => false}

編集フォームを送信すると、ステータスをシンボルとして取得できず、この領域に関するエラーが発生します。
「to_sym」メソッドでステータスパラメータを変更しようとすると、機能します。

params[:my_model][:status] = params[:my_model][:status].to_sym

なぜこの方法を使用する必要があるのですか? データをシンボルとして送信する方法はありますか?

4

4 に答える 4

5

HTML フォームから受け取ったデータは常に文字列であり、Rails はこれらの種類の値をシンボルに自動変換しません。一般に、値ではなくキーが記号化されます。

値 (:new、:old など) を文字列として扱うことをお勧めします。そうすれば一貫性が保たれます。また、データストアは、何らかのシリアル化を行わないとシンボルを処理できない可能性が高いことに注意してください (たとえば、シンボルは yaml に変換されます)。

于 2012-12-13T20:37:35.037 に答える
1

Railsビューのシンボルを書き込んだ場合でも、すべてのシンボルが文字列としてHTMLに解析されることに注意してください。HTTPにはルビーシンボルの概念がないため、データをシンボルとして送信することはできません。

コントローラでパラメータを取得するとき、それらをシンボルと照合する場合は、それらをシンボルに解析するのはあなたの責任です。

于 2012-12-13T20:40:36.367 に答える
1

params[:something] から得られるものは常に文字列になります。データベースのステータスのデータ型は何ですか?
私はあなたがただできると思っています

validates_inclusion_of :status, :in => [nil, "new", "old"], :message => "......"

于 2012-12-13T20:42:52.650 に答える
0

HTTP リクエストにはデータ型はありません。データは、完全に文字列であるクエリ文字列またはリクエスト本文にラップされます。

Rails はその文字列のみを解析し、「params」と呼ばれるハッシュに変換します。キーの各値は、リクエストに基づく文字列またはファイル オブジェクトです。ハッシュキーの値としてシンボルを取得することはありません。

のような文字列を使用してみてください

'new', 'old'

関数呼び出し to_sym を回避できるように

于 2012-12-13T20:42:57.063 に答える