Какой подход вы используете для встраивания ссылок во флэш-сообщения?
-
19-09-2019 - |
Вопрос
Возможность иметь флэш-сообщения (уведомления, ошибки, предупреждения и т. д.) со встроенными ссылками удобна с точки зрения взаимодействия с пользователем.Однако встраивание тега привязки во флэш-сообщение от контроллера является грязным.
Предположим, что такое мгновенное сообщение полезно для удобства использования*:
Пример уведомления о мгновенном сообщении со встроенной ссылкой http://img.skitch.com/20090826-xbsa4tb3sjq4fig9nmatakthx3.png (заимствовано из DailyMile.com)
Какую тактику вы бы выбрали между контроллером и представлением, чтобы аккуратно использовать что-то подобное?
Решение
Просто подумал, что поделюсь этим, так как нашел ответ, который искал в другом месте:
Работает на рельсах 3.1
flash[:notice] = "Proceed to #{view_context.link_to('login page', login_path)}".html_safe
Другие советы
Гленн Гиллен имеет подход, который он называет Полезные флэш-сообщения в Rails.
Я изменил его фрагменты кода, чтобы они были более идиоматичными (по крайней мере, для меня).
Контроллер заполняет флеш так:
flash[:notice] = "Your profile was updated. %s"
flash[:notice_item] = ["Edit again?", edit_profile_path(@profile)]
Тогда у вас могут быть помощники, которые выглядят примерно так:
def render_flash_messages(*keys)
messages = keys.collect do |key|
content_tag(:p, flash_message_with_item(key), :class => "flash #{key}") if flash[key]
end.join
content_tag(:div, messages, :id => "flash_messages") unless messages.blank?
end
def flash_message_with_item(key)
item = flash["#{key}_item".to_sym]
substitution = item.is_a?(Array) ? link_to(*item) : item
flash[key] % substitution
end
Представление выглядит просто так:
<%= render_flash_messages(:error, :notice, :warning) %>
Вид (через flash_message_with_item
helper) отвечает за создание тега привязки, но контроллер управляет тем, что входит в флэш-сообщение, включая дополнительный ресурс для дальнейших действий.
Вы можете создать вспомогательный метод для визуализации частичных значений на основе значения, переданного обратно во флэш-сообщении.
Это похоже на link_to() во флэш-памяти Rails
# In your controller
flash[:error] = render_to_string(:partial => "sessions/login_failed_message")
# In sessions/_login_failed_message.html.erb
Login failed. If you have forgotten your password, you can #{link_to('reset it', reset_path)}