您在Flash消息中嵌入链接的方法是什么?
从用户交互的角度来看,具有嵌入式链接的闪存消息(通知,错误,警告等)的能力是很好的。 但是,在来自控制器的flash消息中嵌入锚标记很脏。
让我们假设这样的flash消息对可用性有好处*:
嵌入式链接示例Flash消息通知http://sofzh.miximages.com/ruby-on-rails/skitch (从DailyMile.com借来)
在控制器和视图之间采取什么策略来干净利用这样的东西?
只是想我会分享这个,因为找到的答案我在其他地方寻找:
适用于轨道3.1
flash[:notice] = "Proceed to #{view_context.link_to('login page', login_path)}".html_safe
Glenn Gillen有一种方法,他称之为Rails中的有用Flash消息 。
我将他的代码片段修改为更加惯用(至少对我来说)。
控制器像这样填充闪光灯:
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
帮助程序)负责创建锚标记,但控制器管理进入flash消息的内容,包括用于进一步操作的可选资源。
您可以创建一个辅助方法,根据flash消息中传回的值渲染部分内容。
这类似于Rails flash中的link_to()
# 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)}