2

私はbackbone.jsサイトのサーバー側としてrailsを使用しているため、railsオブジェクトを常に前後に渡します。

Railsが返すエラーに気づいていWARNING: Can't mass-assign protected attributes: id, created_at, updated_atます。

もちろん、これらのフィールドを含める必要がなかったので、これは奇妙だと思います。私のjsonは、私が知る限り、かなり正常に見えます。

パラメータ:{"id" => 1、 "updated_at" => "2011-04-21T16:41:02Z"}、 "created_at" => "2012-02-23T21:01:02Z"、 "action" => 「テストアップデート」}
4

2 に答える 2

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"}

およびフィールドが含まれてidいます。このJSONがアクションに渡され、ハッシュがで使用されると、このエラーが発生します。このエラーを回避するには、ハッシュからフィールドを削除して後で割り当てるか、理想的には、ActiveRecordを機能させて、それらを無視します。created_atupdated_atmodel_object.update_attributes(hash_fields)

本当にそれらを割り当てる必要がある場合は、次のように行うことができます。

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

EDIT1(IDの返送に関するコメントに対処するため):

RailsRESTモデルを使用してcontroller/:id / action urlを呼び出す場合、その情報はすでにURLに埋め込まれているため、IDを返す必要はありません。経由でアクセスでき、経由params[:id]でハッシュにアクセスできますparams[:model_name](Railsモデルに従います)。

何か別のことをしていて、IDが返されるJSONに含まれている必要がある場合は、簡単に行うことができますid = params[:model_name][:id].delete。これにより、ハッシュからIDが削除され、1回の呼び出しで値が返されます。それは理想的ではありませんが、ピンチで仕事を成し遂げることができます。

于 2012-02-24T18:29:03.750 に答える
4

これらの列は、一括割り当てに対してデフォルトで保護されており、手動で設定することはできません。ただし、メソッドを定義することで、この動作をオーバーライドできます。

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

created_atこれにより、updated_at手動で割り当てることができます。

于 2012-02-24T14:24:40.543 に答える