5

フラッシュヘルパーをセットアップしました:

def flash_message
  flash.each do |key, msg|
    content_tag :div, msg, :id => key, :class => 'flash'
  end
end

そして、これをapplication.html.erbに入れました:

<%= flash_message %>

そして、次のようなコンテンツを返します:

{:notice=>"Testing"}

私はレールにかなり慣れていないので、これはアマチュアの間違いかもしれません。

4

4 に答える 4

10

そうです、素人のミスです。;)

ここで .each を使用すると、メッセージが繰り返され、それぞれの div が作成されます。必要なのは、div から配列を作成し、最後にそれらを連結することです。このようなもの:

def flash_message
  flash.map do |key, msg|
    content_tag :div, msg, :id => key, :class => 'flash'
  end.join
end
于 2012-09-10T04:08:20.457 に答える
4

あなたは間違いを犯しておらず、ヘルパーを作成することで、一般的なことを行うために必要なコードの量を減らすことができます。これは、テストと組織化に最適です.

私が持っている 1 つの提案は、セットアップを変更し、コードを表示する共有パーシャルを作成して、管理しやすくすることです。次に、ヘルパー メソッドで引数を部分関数呼び出しにプロキシします。

最初にパーシャルをセットアップします (shared/_flash_messages.html.erb として保存します):

<div class="flash-messages">
<% if messages && messages.length > 0 %>
 <% messages.each do |key, message| %>
  <div id="<%= key %>" class="flash"><%= message %></div>
 <% end %>
<% else %>
  No Messages to display
<% end %>
</div>

次に、ヘルパー メソッドをセットアップします。

def register_flash_message(key,message)
  flash[key]=message
end

def display_flash_messages()
  render 'shared/flash_messages', :messages => flash
end

これにより、保守とカスタマイズがはるかに簡単になります。すべてがパーシャル内に格納されるため、Ruby 内で HTML を作成する必要もありません。

于 2012-09-10T04:59:15.100 に答える
1

問題はヘルパーの復帰です。html コードを変数で返す必要があります。

この小さな変更でうまくいきました:

  def flash_message
    html = ""
    flash.each do |key, msg|
      html << (content_tag :div, msg, :id => key, :class => 'flash')
    end
    html
  end

ruby の最後の行は改行であることを思い出してください。

于 2012-09-10T04:13:26.233 に答える
0

フラッシュ メッセージ スパンで閉じるボタンを取得するには、次のようにします: (おそらくもっと適切に記述できます):

  def flash_helper
    content_tag :div, class: "flash-messages" do
      flash.map do |key, value| 
        content_tag :div, class: "alert alert-dismissable alert-#{key}" do 
          content_tag(:span, '&times;'.html_safe, class: :close, 'data-dismiss' => 'alert') + value
        end
      end.join().html_safe
    end
  end
于 2014-03-29T16:18:18.783 に答える