2017-03-27 3 views
0

私はseveral | articlesについては、Railsでparams.require(...)を使用していますが、実際のシナリオではそれを示すものは何もありません。Railsでparams.requireを正しく使うには

具体的には、以下のURLが呼び出されます:は文字列になります

GET http://myapp.example.com/widgets/{clientUuid} 

。私は、提供されたがnullでなく、空でないかどうかを(適切なコントローラのアクションから)チェックしたいだけです。

if params.require(params[:clientUuid]) == null 
    response = { "error" => "bad client uuid" } 
    render json: response, status: :bad_request 
    return 
end 

ヌルネス/ノンエンプティが強制されていますか?そうでない場合は、私の望む結果を達成するために何ができるでしょうか? requireパラメータが欠落している場合ActionController::ParameterMissing例外を発生させているため、params.require

if params[:clientUuid].blank? 
    response = { "error" => "bad client uuid" } 
    render json: response, status: :bad_request 
    return 
end 

はそれが少し難しいですが、パラメータは、私が推測何falseは(まだ返すことができます:

答えて

1

あなただけ書くことができます)あなたの例では無効:

begin 
    uuid = params.require(:cliendUuid) 
rescue ActionController::ParameterMissing 
    # nothing to do, just ensure the exceptions is rescued 
end 

unless uuid 
    # handle missing uuid 
end 

または:

begin 
    uuid = params.require(:cliendUuid) || raise ActionController::ParameterMissing 
rescue ActionController::ParameterMissing 
    # handle missing uuid 
end 
+0

おかげ - 良い 'を知って.blank? '。 'params.require'をつけておくと、コードスニペットを更新して、同様のコンテキストで' params.require'をどのように使うことができるかを知ることができます。再度、感謝します! – smeeb

+0

私の回答は更新されましたが、 'params.require'バージョンを使用することはお勧めしません。 IMHO 'require'はあなたのユースケースから構築されました。 – spickermann

0

強力なパラメータを投稿した記事は、特に、通常はフォームによって提供されるユーザー入力からデータベースデータを保護することに関するものです。

params.require(:user).permit(:username) 

上記のコードは、モデルユーザーの属性名をタッチすることだけを許可することを指定します。たとえば、他の属性を使用してユーザー表内のユーザー・レコードを更新または作成しようとすると、電子メールの属性が「許可」されていないため、エラーが発生します。これはホワイトリストの意味です。上記のコードはcreateまたはupdateコントローラの方法、または何らかの方法でデータを修正するその他の方法でのみ表示されます。 (例外はもちろん、レコードを削除することです)。

この例では、パラメータはURLの一部として提供されています。このURLは、paramsのハッシュを使用してアクセスすることもできます。ただし、メソッドがdbと対話していないため、許可メソッドで実行する必要はありません。

This resourceが参考になる場合があります。

0

あなたは経路を混乱させ、完全に異なる用途を意図した方法を使用することによって、単純なGET要求を複雑にしています。

アイデアは.requires要求がパラメータで体を含有する非冪等リクエストメソッド(POSTPUTPATCH)のために使用されるべきであるということです。パラメタから単一のキーを取り出し、含まれているパラメータをホワイトリストに登録することができます。これは、ルート名としてリソースの名前をハッシュした入力をネストするRailsの理想に一致します。

この場合、.requiresを使用すると、リクエストボディが適切な構造を持たないため、要求を処理できないことを示す応答コード(422 - Unprocessable Entity)をクライアントに返すことができます。

潜在的にGET要求で創造的に使用できますが、安心できるアプリケーションエンジニアリングの観点からは間違いです。あなたの場合、clientUuidがレコードと一致しない場合は、404 - Not found応答コードを返す必要があります。通常、これは、フレームワークがキャッチするActiveRecord::RecordNotFound例外を発生させる.findを使用して行われます。

また、最初にルートを正しく宣言していれば、idセグメントがないとリクエストが一致しないため、実際にはレールが自動的に404を与えます。

class WidgetsController < ApplicationController 
    def show 
    @widget = Widget.find(params[:clientUuid]) 
    end 
end 

あなたがparamは条件に一致しない場合、データベースが照会されることはありませんように、あなたは早く保釈可能性がしたい場合は、次の(1)@spickermann

class WidgetsController < ApplicationController 
    def show 
    raise ActiveRecord::RecordNotFound if params[:clientUuid].blank? 
    @widget = Widget.find(params[:clientUuid]) 
    end 
end 
関連する問題