Какой подход вы используете для встраивания ссылок во флеш-сообщения? - PullRequest
21 голосов
/ 26 августа 2009

Возможность иметь флеш-сообщения (уведомление, ошибка, предупреждение и т. Д.) Со встроенными ссылками удобна с точки зрения взаимодействия с пользователем. Однако встраивание тега привязки во флэш-сообщение от контроллера является грязным.

Предположим, что такое флэш-сообщение хорошо для удобства *:

Пример уведомления о флеш-сообщении со встроенной ссылкой http://img.skitch.com/20090826-xbsa4tb3sjq4fig9nmatakthx3.png (заимствовано у DailyMile.com )

Какую тактику вы бы выбрали между контроллером и представлением, чтобы использовать что-то вроде этого чисто?

Ответы [ 4 ]

24 голосов
/ 04 августа 2011

Просто подумал, что поделюсь этим, так как нашел ответ, который искал в другом месте:

Работы на рельсах 3.1

flash[:notice] = "Proceed to #{view_context.link_to('login page', login_path)}".html_safe
8 голосов
/ 26 августа 2009

Гленн Гиллен имеет подход, который он называет Полезные Flash-сообщения в 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) отвечает за создание тега привязки, но контроллер управляет тем, что входит во флэш-сообщение, включая дополнительный ресурс для дальнейших действий.

1 голос
/ 31 июля 2011

Это похоже на link_to () в Rails flash

# 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)}
1 голос
/ 26 августа 2009

Вы можете создать вспомогательный метод для визуализации партиалов на основе значения, переданного обратно во флэш-сообщении.

...