也许这有点矫枉过正了,但我正在尝试使用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
答案 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