当用户在我的 Rails 应用程序上登录失败时,我想将他们指向密码重置页面:
flash[:notice] = "Login failed. If you have forgotten your password, you can #{link_to('reset it', reset_path)}"
但是,我不能在控制器中使用 link_to。不混合控制器和视图逻辑的最佳方法是什么?
我最好的猜测是闪光灯是错误的地方,但我会很感激任何意见。
当用户在我的 Rails 应用程序上登录失败时,我想将他们指向密码重置页面:
flash[:notice] = "Login failed. If you have forgotten your password, you can #{link_to('reset it', reset_path)}"
但是,我不能在控制器中使用 link_to。不混合控制器和视图逻辑的最佳方法是什么?
我最好的猜测是闪光灯是错误的地方,但我会很感激任何意见。
我认为最常见的解决方案是在您的登录表单中粘贴指向密码重置页面的链接,这样您的 Flash 消息根本不需要处理它。这也允许用户在没有登录失败的情况下请求重置。
如果您想在 flash 消息中执行此操作,您应该使用url_for
来构建链接而不是link_to
.
或者,您可以渲染部分消息,而不是在控制器中硬编码消息。
flash[:error] = render_to_string(:partial => "shared/login_failed_message")
# in shared/_login_failed_message.html.erb
<%= "Login failed. If you have forgotten your password, you can #{link_to('reset it', reset_path)}" %>
今天,这个问题的最佳答案可能是(摘自http://www.railsexperiments.com/using-helpers-inside-controllers)
flash[:notice] = "Login failed. If you have forgotten your password, you can #{view_context.link_to('reset it', reset_path)}".html_safe
flash[:notice] = "Login failed. If you have forgotten your password, you can <a href='#{url_for(reset_path)}'>reset it</a>"
正确,link_to 是一个视图助手。请我们以更通用的方式构建链接,à la url_for