2016-09-15 3 views
2

私はfilters controllertagsを持つ統合オブジェクトを持っています。私は統合オブジェクトを更新しようとしています。私はこのように見える強力なパラメータを使用しています。強いパラメータの必要性を理解する - レール

def filters_params 
    params.require(:filters).permit(:tags) 
end 

正確にはrequireは強力なパラメータで表されますか?それは鍵ですか?そして、どうすればこの仕事をすることができますか?

答えて

2

paramsは、おそらくHTMLフォームとウェブブラウザを使用してWebサーバーにリクエスト(テキストメッセージ)を送信したパラメータのハッシュオブジェクトです。このリクエストメッセージは、ラックごとにルビーハッシュに解析されます(Railsはhttp://rack.github.io/アプリです)。 railsアプリケーションはこれを受け取り、要求パスに基づいて適切なコントローラーで処理するようにルーティングします(http://www.rubydoc.info/gems/rack/Rack/Requestreq.params)。ルーティングはconfig/routes.rbファイルで指定されています。

あなたparamsあなたがウェブアプリをレールに送っparamsがあり、解析され、あなたは簡単にこのような構造のクラスをコントローラにいくつかのbinding.pryhttps://github.com/pry/pryを入れて検査することで、それを調べることができhttp://apidock.com/rails/ActionController/Parameters という名前のコード構造に変わりました。次に、答えとしてapidockを押すだけです(コンソールからソースコードを表示する動的な方法もあります)。

しかし、あなたの質問に答えるために...

強力なパラメータは、スキーマの種類(データ構造)仕様/検証されています。

したがってparams.require(:filters).permit(:tags)は、基本的には、次のようなハッシュを期待していることを意味します。{filters: {tags: []}。あなたが何かを与えなければ、エラーが発生します。許可されていないものを与えると無視されます。

フィルタリング/ホワイトリストリングを使用すると、質量を簡単に割り当てることができます。さもなければ誰かが例えばハッシュを置くことができる:{user: {is_admin: true, id: 123}}。代わりに、たとえば名前とアドレスの変更のみを許可することができます。さらに詳しい情報: http://apidock.com/rails/ActionController/Parameters/require

def require(key) 
     value = self[key] 
     if value.present? || value == false 
     value 
     else 
     raise ParameterMissing.new(key) 
     end 
    end 

http://apidock.com/rails/ActionController/Parameters/permit

def permit(*filters) 
     params = self.class.new 

     filters.flatten.each do |filter| 
     case filter 
     when Symbol, String 
      permitted_scalar_filter(params, filter) 
     when Hash then 
      hash_filter(params, filter) 
     end 
     end 

     unpermitted_parameters!(params) if self.class.action_on_unpermitted_parameters 

     params.permit! 
    end 

として:そのような検証を行うにはhttp://edgeguides.rubyonrails.org/action_controller_overview.html#strong-parameters

他の実行可能なRubyのライブラリがhttp://dry-rb.org/gems/dry-validation/

ですところで、あなたはそれがここでどのように動作するかを見ることができますこの場合、それはpermitted_scalar_filter:ですhttp://apidock.com/rails/ActionController/Parameters/permitted_scalar_filter

def permitted_scalar_filter(params, key) 
    if has_key?(key) && permitted_scalar?(self[key]) 
     params[key] = self[key] 
    end 

    keys.grep(/\A#{Regexp.escape(key)}\(\d+[if]?\)\z/) do |k| 
     if permitted_scalar?(self[k]) 
     params[k] = self[k] 
     end 
    end 
    end 

私はこの知識で武装し、あなたの問題を解決することができますことを願っています;)レールの形でレンダリングしてHTMLで

0

ルック。属性'name 'の各入力には、moodle [field]'のようなものが表示されます。このフォームを送信すると、コントローラは '{model:{field:value、other_field:value}}'のようなパラメータを取得します。最後に、メソッドrequireを引数として呼び出すと、モデル名を渡す必要があります。引数として'permit 'では、モデルに存在するフィールドを渡す必要があります。

関連する問題