0

私はこの質問が何度も聞かれたことを知っています。でも、ここから抜け出したい。以下は私のコードです。

request.format.json? ? 
    "#{render :json => {:success => false, :message => 'Exception, provider code not found'}}" : 
    "#{raise 'Exception, provider code not found'}" if params[:provider_code].nil? || params[:provider_code].empty? || params[:provider_code].blank?

# Setting params for patient details.
conditions = {}
conditions['providers.provider_code'] = params[:provider_code] unless params[:provider_code].blank? 


# Using scope to fetch record based on applied conditions.
patients = Patient.with_messages_provider.where(conditions)

# Response for patient details.
patients = Patient.patients_for_provider(patients)
render :json => patients
4

2 に答える 2

1

あなたのコードに基づいて、ここで私の最善の推測は、最初の行が呼び出され、最後の行と競合していることです:

request.format.json? ? 
    "#{render :json => {:success => false, :message => 'Exception, provider code not found'}}" : 
    "#{raise 'Exception, provider code not found'}" if params[:provider_code].nil? || params[:provider_code].empty? || params[:provider_code].blank?

render :json => patients

全体的に、このコードは地獄のように混乱しています。あなたへの私の最初の提案は、それを修正することです。後続の if/unless ステートメントを明確な意図に移動します。

if params[:provider_code].nil? || params[:provider_code].empty? || params[:provider_code].blank?
  if request.format.json?
    "#{render :json => {:success => false, :message => 'Exception, provider code not found'}}"
  else
    "#{raise 'Exception, provider code not found'}"
  end
end

これははるかに読みやすく、理解しやすいものです。なぜ文字列を作成してレンダリングするのかわかりません。これは非正規のコードで、結果は推測できますが、よくわかりません。

あなたがやろうとしているように見えるのは、間違った入力を受け取った場合に救済するための条件を守ることです。その場合は、アクションを終了するためにガード内にリターンを追加する必要があります。

if params[:provider_code].nil? || params[:provider_code].empty? || params[:provider_code].blank?
  if request.format.json?
    return "#{render :json => {:success => false, :message => 'Exception, provider code not found'}}"
  end
  return "#{raise 'Exception, provider code not found'}"
end
于 2013-02-20T17:43:09.553 に答える
0

条件付き ? : 1 つのケースではレンダリングを行い、2 番目のケースではレンダリングしないため、そのロジックを渡した後もまだレンダリングが呼び出されています。

「render」呼び出しはすぐには発生しないこと、およびコントローラー アクションの呼び出しでは、呼び出されるレンダリングが 1 つだけであることを保証する必要があることに注意してください。

エラーが原因で render を呼び出した場合、エラーが発生したときにデフォルトのレンダリングを防止するように、ロジックを作り直す必要があります。

于 2013-02-20T17:39:56.940 に答える