2

これは本当につまらない質問かもしれませんが、パラメータのリストにアクセス可能な属性ではないものがたくさん含まれている場合、つまり

params = {"controller"=>"api1/users", "action"=>"create"}

パラメータにアクセス可能な属性のみが含まれるように「サニタイズ」する最良の方法は何ですか。私が現在考えている現在の方法は、次のことです。

User._accessible_attributes[:default].entries

これにより、アクセス可能な属性のリストが得られ、それらのパラメーターのみが渡されます。

["", "email", "password", "fb_token", "fb_id", "fb_name", "first_name", "last_name", "gender"

別の可能な方法は、これを持つことです:

  def clean_params #ANTIPATTERN
    params.delete(:controller)
    params.delete(:action)
  end

しかし、これもアンチパターンのように感じます...

アクセス可能なパラメーターのみを取得するには、params[:user] のようなことを行うことになっていることはわかっていますが、これは API であるため、URL だけで渡すことができると便利です。

ありがとう!

4

2 に答える 2

2

このようにすることもできます...これは、コントローラーで必要なパラメーターでのみ意味を持ちます。クレジット: dhh の要点

class UserController < ApplicationController
  respond_to :html

  def create
    respond_with User.create(user_params)
  end

  private
  def user_params
    params[:user].slice(:email, :first_name, :last_name)
  end

end
于 2012-06-15T04:06:41.770 に答える
2

Rails パラメータ ラッパーがこれを自動的に行います。つまり、最上位でパラメータを受け入れ、たとえば:user便宜上、 User モデルにアクセスできないものを除外してグループ化します。内部的にはaccessible_attributes、あなたが行ったことと同様に を使用します。API を使用する人は、属性をグループ化する必要はありません。レールはパラメーターをコントローラー アクションに渡す前にグループ化を行います。

デフォルトでは、JSON リクエストに対して有効になっていますが、編集して拡張できますinitializers/wrap_parameters.rbwrap_parametersまたは、コントローラーのメソッドを使用して、コントローラーごとに動作を調整することもできます。

パラメータのサニタイズに関する Rails スキームは、4.0 で変更される可能性が高く、モデルからコントローラーに向かう傾向にあります。今後のプレビューとなる可能性のあるstrong_parameters gemの開発を見たいと思うかもしれません。

于 2012-06-15T04:13:51.940 に答える