2009-08-26 71 views
21

從用戶交互的角度來看,使用嵌入式鏈接進行Flash消息(注意,錯誤,警告等)的能力很好。但是,在控制器的閃存消息中嵌入錨標記是很髒的。你有什麼方法將鏈接嵌入到Flash消息中?

讓我們假設這樣的提示信息是良好的可用性*:

Example Flash Message Notice with an Embedded Link http://img.skitch.com/20090826-xbsa4tb3sjq4fig9nmatakthx3.png (從DailyMile.com借用)

你會採取控制器和視圖之間有什麼戰術,採用類似這乾淨嗎?

回答

24

只是想我會分享這個,因爲找到答案,我一直在尋找其他地方:

工程在軌道上3.1

flash[:notice] = "Proceed to #{view_context.link_to('login page', login_path)}".html_safe 
+0

謝謝你。真棒。 – Dty 2011-08-24 18:16:58

+0

感謝您使用rails 3.1回答更新這個問題! – jpwynn 2012-01-23 08:18:14

+0

將其作爲新的接受答案。這比我之前採取的方式更加清晰。我不知道'view_context'訪問器。 – 2012-01-27 16:18:23

1

您可以創建一個幫助器方法來根據閃回消息中傳回的值渲染部分。

+0

這幾乎感覺分離太多。還有,你在哪裏管理哪些對象或路徑應該鏈接到,而不依賴於部分內的類似全局的實例變量? – 2009-08-26 13:09:32

8

Glenn Gillen有一種方法,他稱Useful Flash Messages in 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助手)負責創建錨標記,但是控制器管理進入閃光消息的內容,包括進一步操作的可選資源。

+3

我希望能提供一些更精明的建議,但我現在要採用這種方法。 – 2009-09-02 01:28:15

1

這類似於link_to() in 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)} 
相關問題