2017-02-03 4 views
1

私のRailsアプリケーションでは、filterpost_typeのパラメータを検証したいと考えています。Railsでパラメータを検証する

どちらもオプションですが、存在する場合は値を持つ必要があり、有効な値の配列に一致する値を持つ必要があります。

def validate_filter 
    if params.has_key?(:filter) 
    if params[:filter].present? 
     if ['popular', 'following', 'picks', 'promoted', 'first-posts'].include?(params[:filter]) 
     return true 
     else 
     return false 
     end 
    else 
     return false 
    end 
    else 
    return true 
    end 
end 

def validate_post_type 
    if params.has_key?(:post_type) 
    if params[:post_type].present? 
     if ['discussions', 'snaps', 'code', 'links'].include?(params[:post_type]) 
     return true 
     else 
     return false 
     end 
    else 
     return false 
    end 
    else 
    return true 
    end 
end 

そして私は私のメインコントローラメソッドに:私はそれらをチェックするための2つのメソッドを持っている私のコントローラで

def index 
    raise ActionController::RoutingError.new('Not Found') unless validate_filter && validate_post_type 
    ... 

だから、これはpost_type=post_type=camを意味は、404を返しますが、 post_type=snapsはtrueを返します。

渡されたパラメータが有効であることを確認するには、空でもキー自体にも有効であることを検証する方法がありますか?このシナリオでは、blank?present?を使用するだけでは不十分です。

+0

アプリケーションがRestAPIが、代わりに、このような場合のためのカスタムバリデータの[JSON-スキーマ](https://github.com/ruby-json-schema/json-schema)を使用しようと使用している場合。 –

答えて

1

私はおそらくこのロジックをモデルに移していますが、コントローラに本当に必要ならば簡単にすることができます。

def validate_filer 
    return true unless params.has_key?(:filter) 
    ['popular', 'following', 'picks', 'promoted', 'first-posts'].include?(params[:filter]) 
end 
+0

これは素晴らしく、最小限です。 '%w(人気のある次のピックは最初の投稿を宣伝しました。)は?@(params [:filter])' @spickermannのようにすると、もっとスリムになりました。 – Cameron

0

おそらく小さなヘルパーメソッド:それはそれは、彼らがクエリパラメータやパスの一部である場合は、から来ているparamsはあなたの質問から明らかではない

def validate_filter 
    params_include?(:filter, %w(popular following picks promoted first-posts)) 
end 

def validate_filter 
    params_include?(:post_type, %w(discussions snaps code links)) 
end 

def params_include?(key, values) 
    !params.key?(key) || values.include?(params[key]) 
end 

。それらが経路の一部である場合、routes.rb

0

コントローラの操作については、before_actionでこれを行うことができます。

before_action: validate_params, only: [:index] 

def validate_params 
    return false unless params[:filter].present? && params[:post_type].present? 
    params_include?(:filter, %w(popular following picks promoted first-posts)) 
    params_include?(:post_type, %w(discussions snaps code links)) 
end