2012-02-24 10 views
2

私はbackbone.jsサイトのサーバー側としてrailsを使用しています。したがって、私は常にレールオブジェクトを前後に渡しています。Railsはid、created_atの保護属性を一括割り当てできません

レールでエラーが発生しています。WARNING: Can't mass-assign protected attributes: id, created_at, updated_atです。もちろん

私はこれらのフィールドを含める必要がなかったので、私はこれは奇妙な見つける 私のJSONは、私の知る限り、これらの列は質量割り当てのために、デフォルトで保護されてい

 
Parameters: {"id"=>1, "updated_at"=>"2011-04-21T16:41:02Z"}, "created_at"=>"2012-02-23T21:01:02Z", "action"=>"test update"} 

答えて

7

JSONに問題はありません。問題はセキュリティの1つです。 Railsは、デフォルトで特定の属性を作成または更新することを巨大なハッシュから保護します。これは、「質量割り当て」という用語を使用するときにエラーが参照しているものです。

あなたが投稿JSON:

Parameters: {"id"=>1, "updated_at"=>"2011-04-21T16:41:02Z"}, "created_at"=>"2012-02-23T21:01:02Z", "action"=>"test update"} 

idcreated_atupdated_atフィールドが含まれています。このJSONがアクションに渡され、ハッシュがmodel_object.update_attributes(hash_fields)で使用されると、このエラーが発生します。このエラーを回避するには、ハッシュからフィールドを削除して後で割り当てることができます。理想的には、ActiveRecordが魔法を働かせて無視するだけです。

あなたは本当にあなたがそのような操作を行うことができ、それらを割り当てる必要がない場合:

model_object.id = id_variable 
model_object.created_at = created_at_variable 
model_object.updated_at = updated_at_variable 
model_object.save 

はEDIT1(IDをバックパッシングについてのコメントを対処するために):

あなたがRailsのRESTモデルを使用している場合コントローラ/:id/action urlを呼び出すと、その情報が既にURLに埋め込まれているため、IDを渡す必要はありません。これはparams[:id]でアクセスし、params[:model_name]経由でハッシュすることができます(Railsモデルに従います)。

あなたは何か違うことをやっているとID その後、あなたは、単にid = params[:model_name][:id].deleteを行うことができますし、それはハッシュからIDを削除し、1回の呼び出しで値を返します戻って渡されるJSONにする必要があります。それは理想的ではありませんが、ピンチで仕事を終わらせることができます。

+0

しかし、更新では常にIDは返される必要がありますが、更新はされません。私はそれが私の最大の懸念だと思う。バックボーンにタイムスタンプを送信しないと、返されませんが、IDを送信する必要があります。私はそれが私がとても混乱している理由だと思う。レールがどのように「私を守っているか」を見ることができますが、私はこの機会にこれをなぜ見ているのか知りたいのですが。 – pedalpete

+0

恐ろしく、あなたの更新のために感謝します。あなたのコメントまで私は気づいていなかったそのモデルについて、私は安らかなアップデートをしていませんでした。今、私は安心して行くかどうか、そしてなぜこの返答を得ているのか理解するオプションを持っています。 – pedalpete

+0

ちょうどこれまでのフォローアップ - 私は同じ問題にぶち当たっていて、私の場合は「更新」のIDも削除していますが、「ベスト」の解決策が何か不思議です。埋め込まれた属性やメソッドの戻り値(計算されたラベルなど)として返されるため、更新することもできません。これをもっときれいに扱うためのレールコンベンションはありますか? – MBHNYC

3

を伝えることができるようにかなり正常な外観と手動で設定することはできません。しかし、あなたはメソッドを定義することによって、この動作を無効にすることができます。これは、手動でcreated_atupdated_atを割り当てることができます

def self.attributes_protected_by_default 
    [] # ["created_at", "updated_at" ..other] 
end 

+0

Syedに感謝します。私はそれらを乗り越えたくありません。私はRailsに何が起こっていると思うか考えていますか?何か案は? – pedalpete

+0

タイムスタンプ(created_at、updated_at)とidカラムがActiveRecordに自動的に埋め込まれているという事実は、それらの値を送信していれば大量に割り当てられているということです。 –

関連する問題