【问题标题】:link_to() in Rails flashRails flash 中的 link_to()
【发布时间】:2014-02-08 18:24:45
【问题描述】:

当用户在我的 Rails 应用程序上登录失败时,我想将他们指向密码重置页面:

flash[:notice] = "Login failed.  If you have forgotten your password, you can #{link_to('reset it', reset_path)}"

但是,我不能在控制器中使用 link_to。在不混合控制器和视图逻辑的情况下,最好的方法是什么?

我最好的猜测是闪光灯是错误的地方,但我会很感激任何意见。

【问题讨论】:

    标签: ruby-on-rails erb flash-message


    【解决方案1】:

    我认为最常见的解决方案是在您的登录表单中粘贴指向密码重置页面的链接,这样您的 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)}" %>
    

    【讨论】:

    • 谢谢 - 部分正是我所需要的。
    • 我发现这不起作用(在 Rails 3.1 中),因为所有输出在渲染之前都被转义了。所以你会得到类似“列表保存到 <a href="/teams/1>David Tuite's Team</a>”
    • 只是想指出一个使用 view_context 的替代解决方案 - stackoverflow.com/questions/1332013/…
    【解决方案2】:

    今天这个问题的最佳答案可能是(来自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
    

    【讨论】:

    • 不幸的是,这在 Rails 6 中似乎不起作用。
    【解决方案3】:
    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多