把链接放在闪光灯[:notice]

Dav*_*ill 44 ruby ruby-on-rails

我正在学习Ruby和Rails.

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

flash[:notice] = "Created job job number #{update.id}."
Run Code Online (Sandbox Code Playgroud)

我想将其#{update.id}转变为工作清单上的工作链接.

转到作业的URL 是闪存通知中显示的jobs/list?job=12341234 update.id.

是否可以将链接放入flash[:notice]声明中?或者我是否需要重新处理此消息的显示方式才能将其转换为链接?

Kir*_*ill 42

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

  • 很抱歉成为一个杀戮的快乐,但这是对答案的评论,而不是真正的答案. (3认同)

Dor*_*ian 37

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

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

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

希望这可以帮助 :)

  • @ user664833在Rails 4中你仍然需要`.html_safe`,只是试了一下. (10认同)
  • 非常感谢 - 当然最好使用link_to而不是在字符串中输入HTML!另外我觉得你最后还是要做Kirill的.html_safe. (4认同)
  • 在Rails 5.0中工作,但在ADDITION的实际视图中的flash通知中必须是`.html_safe`才能将其放入控制器中. (3认同)

Emi*_*ily 34

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

flash[:notice] = %Q[Created job number <a href="/jobs/list?job=#{update.id}">#{update.id}</a>]
Run Code Online (Sandbox Code Playgroud)

然后只需确保在视图中显示时不会转移闪存的内容.

  • 您可以使用`%Q []`或其他等效分隔符`()[] {} <>`来避免难看的反斜杠转义来表示字符串:`%Q [创建的作业号<a href ="/ jobs/list?job =#{update.id}">#{update.id} </A>]` (9认同)
  • 在Rails 4.1中使用它:http://stackoverflow.com/questions/26538891/flash-message-with-html-safe-from-the-controller-in-rails-4 (5认同)

mik*_*kej 16

正如nas所评论的那样,link_to除非你包含适当的辅助模块,否则你的控制器无法使用,但是url_for.因此,除了使用url_for而不是硬编码URL 之外,我会做很多Emily所说的话.

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

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

  • @jcollum我猜测你正在使用Rails 3.x,默认情况下HTML被转义,所以你需要在你的视图或标记中使用`raw`方法,例如`<%= raw(flash [:notice])%>` [Kirill的回答](http://stackoverflow.com/a/5542265/63034)中给出的消息为"html_safe". (4认同)

Sam*_*Dev 7

选定的答案对我不起作用.但这篇文章的答案奏效了.我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 %>
Run Code Online (Sandbox Code Playgroud)

调节器

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

神奇的是sanitize方法.

我也不需要使用.html_safe.


Giu*_*ppe 5

在多利安的答案的基础上,这是一个带有链接的国际化快讯:

flash[:notice] = t('success', go: view_context.link_to(t('product'), @product)).html_safe
Run Code Online (Sandbox Code Playgroud)

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

en:
  success: "Successfully created a %{go}"
  product: "product"
it:
  success: "%{go} creato con successo"
  product: "Prodotto"
Run Code Online (Sandbox Code Playgroud)