【问题标题】:Put a link in a flash[:notice]快速添加链接[:notice]
【发布时间】:2010-02-12 03:08:25
【问题描述】:

我正在学习 Ruby 和 Rails。

我有一个 Ruby on Rails 项目,用于跟踪服务器正在运行的作业。现在,当我手动创建一个新作业时,它会宣布:

flash[:notice] = "Created job job number #{update.id}."

我想将#{update.id} 转为指向工作列表中工作的链接。

前往该职位的 URL 是 jobs/list?job=1234,其中 1234 是 Fl​​ash 通知中显示的 update.id

是否可以将链接放入flash[:notice] 语句中?还是我需要重新设计此消息的显示方式才能将其转换为链接?

【问题讨论】:

  • 如果您尝试了以下所有方法,但它仍然不起作用...您需要在渲染时将消息标记为安全(使用html_safe) ,而不是在您存储消息时!

标签: ruby-on-rails ruby


【解决方案1】:

如果您使用的是 Rails3,请不要忘记在通知末尾添加.html_safe。 所以它会说flash[:notice] = "Your message".html_safe

【讨论】:

  • +1 我没有在这个项目中使用 Rails3,但感谢您提供的信息。
  • 很抱歉,这是一个致命的乐趣,但这是对答案的评论,而不是真正的答案。
【解决方案2】:

@template 实例变量在 Rails 3 中不再可用

您可以在控制器中使用它:

flash[:notice] = "Successfully created #{view_context.link_to('product', @product)}.".html_safe

希望这会有所帮助:)

【讨论】:

  • 非常感谢 - 当然最好使用 link_to 而不是在字符串中输入 HTML!另外我认为你最后仍然需要做基里尔的 .html_safe。
  • @user664833 在 Rails 4 的末尾你仍然需要.html_safe,刚刚试了一下。
  • 在 Rails 5.0 中工作,但您必须在实际视图中的 Flash 通知中为 .html_safe,才能将其放入控制器中。
【解决方案3】:

我可能遗漏了一些明显的东西,但你应该能够做到

flash[:notice] = %Q[Created job number <a href="/jobs/list?job=#{update.id}">#{update.id}</a>]

然后确保在视图中显示 Flash 的内容时没有转义它。

【讨论】:

  • 您可以使用%Q[] 或其他等效分隔符()[]{}&lt;&gt; 来表示字符串,以避免难看的反斜杠转义:%Q[Created job number &lt;a href="/jobs/list?job=#{update.id}"&gt;#{update.id}&lt;/a&gt;]
  • 根据this guy,这在 Rails 4.1 中不起作用。我也无法让它工作。
  • 让它在 Rails 4.1 中工作:stackoverflow.com/questions/26538891/…
【解决方案4】:

正如 nas 所评论的,link_to 在您的控制器中不可用,除非您包含适当的帮助模块,但 url_for 是。因此,除了使用 url_for 而不是硬编码 URL 之外,我几乎会按照 Emily 所说的去做。

例如如果作业被定义为您的路线中的资源:

link = "<a href=\"#{url_for(update)}\">#{update.id}</a>"    
flash[:notice] = "Created job number #{link}"

【讨论】:

  • 当我这样做时,我得到的文字是 而不是超链接。
  • @jcollum 我猜您使用的是 Rails 3.x,其中 HTML 默认转义,因此您需要使用 raw 方法,例如&lt;%=raw(flash[:notice])%&gt; 在您的视图中或将消息标记为 html_safe,如 Kirill's answer 中给出的那样。
  • 是的,我尝试将 #{thing.html_safe} 放入,但了解到您必须将 html_safe 放入整个字符串的末尾,而不是 #{} subst。
  • @jcollum 没错。如果您将安全字符串作为子字符串放入非安全字符串中,则生成的字符串是不安全的(这是您所期望的)。因此,必须将整个消息标记为安全,以防止您的 HTML 被转义。
  • ActionController url_for 已弃用或移至最新的稳定版本。
【解决方案5】:

所选答案对我不起作用。但答案from this post 奏效了。顺便说一句,我正在使用Rails 4.2.4。在我链接的答案的指导下,我是这样做的:

查看

<% flash.each do |name, msg| %>
  <div class="alert alert-<%= name %>">
    <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
    <div id="flash_<%= name %>"><%= sanitize(msg) %></div>
  </div>
<% end %>

控制器

flash[:success] = "Blah blah. #{view_context.link_to('Click this link', '/url/here')}"

神奇的是sanitize 方法。

我也不需要使用.html_safe

【讨论】:

  • 我认为这也是 Rails 5 的相关答案。
【解决方案6】:

基于 Dorian 的回答,这是一个国际化的闪存,其中包含一个链接:

flash[:notice] = t('success', go: view_context.link_to(t('product'), @product)).html_safe

您的翻译(例如 YAML 文件)可能包含的位置:

en:
  success: "Successfully created a %{go}"
  product: "product"
it:
  success: "%{go} creato con successo"
  product: "Prodotto"

【讨论】:

    【解决方案7】:

    您可以在控制器中为 link_to 函数或 RailsCast 配方使用别名:

    "Created job job number #{@template.link_to update.id, 
      :controller => 'jobs', :action => 'list', :job => update.id}."
    

    http://railscasts.com/episodes/132-helpers-outside-views

    【讨论】:

      【解决方案8】:

      您始终可以使用 Rails link_to 助手:

      flash[:notice] = "Created job job number #{link_to update.id, :controller => 'jobs', :action => 'list', :job => update.id}."
      

      【讨论】:

      • 我认为 link_to 不会在控制器中工作,除非您在控制器中包含辅助模块,但那样会污染命名空间。
      猜你喜欢
      • 2011-04-11
      • 1970-01-01
      • 2020-05-22
      • 2022-01-04
      • 1970-01-01
      • 2012-02-24
      • 2020-04-10
      • 2012-10-24
      • 1970-01-01
      相关资源
      最近更新 更多