在此操作中多次调用渲染和/或重定向

时间:2013-02-20 17:30:49

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

我知道这个问题很多次。但我想摆脱这个。以下是我的代码。

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

2 个答案:

答案 0 :(得分: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

这更具可读性和可理解性。我不知道你为什么要提升并渲染成一个字符串。这是非正常的代码,我可以猜出结果是什么,但我不确定。

如果输入错误,您尝试做的事情是guard conditions拯救。如果是这种情况,您将需要在gaurds中添加退货以退出操作。

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

答案 1 :(得分:0)

有条件的? :在一种情况下进行渲染,在第二种情况下不进行渲染,所以发生的事情是,在您通过该逻辑之后,仍然会调用渲染。

请记住'渲染'呼叫不会立即发生,并且对控制器动作的调用必须确保只有一个渲染器被调用。

您必须重新修改逻辑,这样如果由于错误而调用渲染,则会在出现错误时阻止默认渲染。