rails 4干燥控制器,具有单个渲染错误

时间:2014-07-06 08:54:39

标签: ruby-on-rails ruby ruby-on-rails-4 dry

也许这有点矫枉过正了,但我正在尝试使用after_filter来干掉这个控制器。令我沮丧的是,它正在爆炸,我似乎无法弄清楚为什么。为了使它工作,我不得不在每个方法中添加渲染。

思想?

错误消息

  

在此操作中多次调用渲染和/或重定向。   请注意,您最多只能调用渲染或重定向   每次行动一次。另请注意,重定向和渲染都不会终止   执行动作,所以如果你想在之后退出动作   重定向,你需要做一些像“redirect_to(...)和   返回”。

控制器

class ErrorController < ApplicationController
  after_filter :render_me

  def javascript_disabled
    @title = 'Error! Javascript Disabled'
  end

  def system_requirements
    @title = 'Error! System Requirements'
  end

  def browser_upgrade_required
    @title = 'Error! Browser Upgrade Required'
  end

  private

  def render_me
    render 'error/system_requirements', layout: 'error'
  end

end

路线

  scope 'error' do
    get '/javascript-disabled', to: 'error#javascript_disabled'
    get '/software-requirements', to: 'error#system_requirements'
    get '/browser-upgrade-required', to: 'error#browser_upgrade_required'
  end

3 个答案:

答案 0 :(得分:0)

问题是渲染不会停止方法中的执行。在你的render_me方法中,你调用render,然后执行然后在被调用的action方法中继续...它在它的末尾有一个固有的渲染。

您可以通过在每个操作中自己调用after_filter方法并添加显式返回来暂停执行来解决此问题,如下所示:

class ErrorController < ApplicationController
  def javascript_disabled
    @title = 'Error! Javascript Disabled'
    render_me
  end

  def system_requirements
    @title = 'Error! System Requirements'
    render_me
  end

  def browser_upgrade_required
    @title = 'Error! Browser Upgrade Required'
    render_me
  end

  private

  def render_me
    render 'error/system_requirements', layout: 'error'
  end
end

当然,你可以稍微干一点:

class ErrorController < ApplicationController
  def javascript_disabled
    render_with_error 'Error! Javascript Disabled'
  end

  def system_requirements
    render_with_error 'Error! System Requirements'
  end

  def browser_upgrade_required
    render_with_error 'Error! Browser Upgrade Required'
  end

  private

  def render_with_error(msg)
    @title = msg
    render 'error/system_requirements', layout: 'error'
  end
end

我倾向于认为如果你需要对rails代码库进行修补,那么你可能做错了。

答案 1 :(得分:0)

您已在控制器操作中调用隐式#render。因此,在过滤器再次显式调用#render之后,您将获得DoubleRenderError。

您可以覆盖{/ 1}}这样的方法

#render

我认为这比使用回调即过滤器更好。

答案 2 :(得分:0)

如果其他人发现这篇文章,可以采取另一种方法来解决这个问题:

class ErrorController < ApplicationController

  def javascript_disabled
    @title = 'Error! Javascript Disabled'
    render_it
  end

  def system_requirements
    @title = 'Error! System Requirements'
    render_it
  end

  def browser_upgrade_required
    @title = 'Error! Browser Upgrade Required'
    render_it
  end

  private

  def render_it
    render 'error/system_requirements', layout: 'error'
  end

end