Я хотел немного больше гибкости, чем просто добавление ссылок на флеш-сообщения из файлов YAML (например, имя пользователя, вошедшего в систему и т. Д.), Поэтому вместо этого я хотел использовать запись ERB в строке.
Поскольку я использую bootstrap_flash
, я изменил код помощника следующим образом, чтобы декодировать строки ERB перед отображением:
require 'erb'
module BootstrapFlashHelper
ALERT_TYPES = [:error, :info, :success, :warning] unless const_defined?(:ALERT_TYPES)
def bootstrap_flash
flash_messages = []
flash.each do |type, message|
# Skip empty messages, e.g. for devise messages set to nothing in a locale file.
next if message.blank?
type = type.to_sym
type = :success if type == :notice
type = :error if type == :alert
next unless ALERT_TYPES.include?(type)
Array(message).each do |msg|
begin
msg = ERB.new(msg).result(binding) if msg
rescue Exception=>e
puts e.message
puts e.backtrace
end
text = content_tag(:div,
content_tag(:button, raw("×"), :class => "close", "data-dismiss" => "alert") +
msg.html_safe, :class => "alert fade in alert-#{type}")
flash_messages << text if msg
end
end
flash_messages.join("\n").html_safe
end
end
Затем можно использовать строки, подобные следующим (используя devise):
signed_in: "Welcome back <%= current_user.first_name %>! <%= link_to \"Click here\", account_path %> for your account."
Это может работать не во всех ситуациях, и может быть аргумент, что определения кода и строк не следует смешивать (особенно с точки зрения СУХОЙ), но мне кажется, что это хорошо работает. Код должен быть адаптируем для многих других ситуаций, важными битами являются следующие:
require 'erb'
....
begin
msg = ERB.new(msg).result(binding) if msg
rescue Exception=>e
puts e.message
puts e.backtrace
end