Flash メッセージにリンクを埋め込む場合、どのようなアプローチをとりますか?

StackOverflow https://stackoverflow.com/questions/1332013

  •  19-09-2019
  •  | 
  •  

質問

リンクが埋め込まれたフラッシュ メッセージ (通知、エラー、警告など) を表示できる機能は、ユーザー インタラクションの観点から優れています。ただし、コントローラーからのフラッシュ メッセージ内にアンカー タグを埋め込むのはダーティです。

このようなフラッシュ メッセージが使いやすさに優れていると仮定しましょう*:

埋め込みリンクを含む Flash メッセージ通知の例 http://img.skitch.com/20090826-xbsa4tb3sjq4fig9nmatakthx3.png (からお借りしました デイリーマイル.com)

このようなものをきれいに採用するには、コントローラーとビューの間でどのような戦術をとりますか?

役に立ちましたか?

解決

他の場所で探していた答えが見つかったので、これを共有したいと思いました。

レール 3.1 で動作します

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

他のヒント

グレン・ギレン 彼が呼ぶアプローチがある 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 helper) はアンカー タグの作成を担当しますが、コントローラーは、さらなるアクションのためのオプションのリソースを含め、フラッシュ メッセージに入る内容を管理します。

Flash メッセージで返された値に基づいてパーシャルをレンダリングするヘルパー メソッドを作成できます。

これは次のようなものです Railsフラッシュの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)}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top