2

Railsアプリにいくつかの機能があり、Railsに渡すパラメーターが、コントローラーのリクエストとパラメーターの間のどこかにカプセル化されています。

以前は問題ではありませんでしたが、最近問題が発生したため、なぜ発生したのかを調べてみることにしました。私は運がなかったので、ここの誰かが私を正しい方向に向けてくれることを望んでいます。

クライアントリクエストのペイロードは次のようになります。

{
    "id"=>"1",
    "email" => "peter.hamilton10@imperial.ac.uk",
    "first_name" => "Peter",
    "last_name" => "Hamilton",
    "year" => 3,
    "private_attr" => "something"
}

そしてレールでは、ログはこれを示しています

Started PUT "/students/1" for 127.0.0.1 at 2012-11-29 13:20:56 +0000
Processing by StudentsController#update as JSON
  Parameters: {"id"=>"1",
               "email" => "peter.hamilton10@imperial.ac.uk",
               "first_name" => "Peter",
               "last_name" => "Hamilton",
               "year" => 3,
               "private_attr" => "something",
               "student" => {
                   "email"=>"peter.hamilton10@imperial.ac.uk",
                   "first_name"=>"Peter",
                   "last_name" => "Hamilton",
                   "year"=>3
               }
              }

このstudent属性はどこから来ており、フィールドはどのように生成されますか?

一括割り当てできない属性が表示されないことを知っているので(上に示したようにprivate_attr)、現在のコントローラーのモデルの抽出フィールドを想定していますが、それ以外の場合は少し途方に暮れています...

更新:モデル

# Schema
# create_table "students" do |t|
#   t.string   "email"
#   t.string   "first_name"
#   t.string   "last_name"
#   t.integer   "year"
#   t.integer   "private_attr"
# end
class Student < ActiveRecord::Base
  attr_accessible :email, :first_name, :last_name, :year
end

(注:private_attrが通過することは期待していません。テストとして実行しただけで、役立つかもしれないと思いました)

リクエストは実際にはフォームからのものではなく、手動で生成されたajaxリクエストからのものです。

4

2 に答える 2

0

ラップされたパラメータを見てください:

http://edgeapi.rubyonrails.org/classes/ActionController/ParamsWrapper.html

Rails 4 を使用しているかどうかはわかりませんが、これは内部で起こっていることの最新バージョンです。

于 2013-09-03T16:20:18.927 に答える
0

コントローラーに次のコードを追加します。

wrap_parameters :model, include: Model.column_names + [:attr]

Model - モデル、:attr - 追加の属性

于 2014-05-16T13:11:06.120 に答える