我找到了几个描述render
和redirect_to
之间差异的参考文献,但没有一个能让我知道如何做到我想要的,即直接传递控制(在同一个请求中) ,所以没有redirect_to
)到另一个控制器中的动作。
基本上,我想修复我用于处理登录和会话的示例代码中的错误。如果我登录,但稍后再执行rake db:seed
,则会更改用户的所有ID,并且我的登录会话将变为无效。当我尝试获取当前用户时,这会导致引发令人讨厌的异常:
@current_user ||= Reviewer.find(session[:reviewer_id])
所以要修复它,我想检查一下我的“before_filter”,ensure_login
。像这样的东西(但这不起作用):
unless Reviewer.where(id: session[:reviewer_id]).first
render :action => 'sessions/destroy'
end
这会尝试呈现与sessions/destroy
相关联的模板,但当然没有。{我认为解决方案必须非常简单,但我被困住了。
答案 0 :(得分:6)
解决方案不是实例化另一个控制器并在其上调用操作(组织不良和开销太大),而是将要调用的代码放在一些常用的位置,如助手或lib文件,例如:
# in a controller
unless ...
render_session_destroy
end
# in a relevant helper
def render_session_destroy
...
end
然后render_session_destroy
也可以从原始控制器调用。
答案 1 :(得分:0)
使用redirect_to
例如
redirect_to '/SignOut'
在像
这样的路线中 resources :user_sessions
match '/SignOut', to: 'user_sessions#destroy'