Помощник по флэш-сообщениям Rails

Я настроил флэш-помощник:

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"}

Я новичок в рельсах, так что это может быть любительской ошибкой.


person daryl    schedule 10.09.2012    source источник


Ответы (4)


Вы правы, это любительская ошибка. ;)

Использование .each здесь просто перебирает сообщения и создает div для каждого из них. Что вы хотите, так это сделать массив из div, а затем соединить их вместе в конце. Что-то вроде этого:

def flash_message
  flash.map do |key, msg|
    content_tag :div, msg, :id => key, :class => 'flash'
  end.join
end
person weexpectedTHIS    schedule 10.09.2012

Вы не допустили ошибок, и, создав помощника, вы уменьшили количество кода, необходимого для выполнения обычных задач, что отлично подходит для тестирования и организации.

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

Сначала настройте свой фрагмент (сохраните его как 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

Это значительно упростит обслуживание и настройку. Вам также не придется создавать свой HTML-код внутри Ruby, поскольку все хранится внутри партиала.

person matsko    schedule 10.09.2012

Проблема в возвращении вашего помощника. Вы должны вернуть html-код в переменной.

С этим небольшим изменением у меня сработало:

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

Помните, что последняя строка в ruby ​​— это возврат.

person Enrique Galindo    schedule 10.09.2012

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

  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
person Zippie    schedule 29.03.2014