霍利,非常感谢您分享这种方法。对我来说,它就像是一种魅力。如果可以的话,请投票给您,但这是我的第一篇文章,所以我没有适当的声誉。。。另外一个难题:我意识到您的方法存在的问题是,它仍然无法从内部使用控制器。我做了一些研究,并将您的方法与Glenn在rubypond上的方法结合在一起。
这是我想出的:
查看帮助程序,例如application_helper.rb
def render_flash_messages
messages = flash.collect do |key, value|
content_tag(:div, flash_message_with_link(key, value), :class => "flash #{key}") unless key.to_s =~ /_link$/i
end
messages.join.html_safe
end
def flash_message_with_link(key, value)
link = flash["#{key}_link".to_sym]
link.nil? ? value : string_with_link(value, link).html_safe
end
# Converts
# "string with __link__ in the middle." to
# "string with #{link_to('link', link_url, link_options)} in the middle."
# --> see http://stackoverflow.com/questions/2543936/rails-i18n-translating-text-with-links-inside (holli)
def string_with_link(str, link_url, link_options = {})
match = str.match(/__([^_]{2,30})__/)
if !match.blank?
$` + link_to($1, link_url, link_options) + $'
else
raise "string_with_link: No place for __link__ given in #{str}" if Rails.env.test?
nil
end
end
在控制器中:
flash.now[:alert] = t("path.to.translation")
flash.now[:alert_link] = here_comes_the_link_path # or _url
在locale.yml中:
path:
to:
translation: "string with __link__ in the middle"
在视图中:
<%= render_flash_messages %>
希望这篇文章能赢得我的声誉,以投票支持你,霍利:)欢迎任何反馈。