Почему помощник content_tag печатает содержимое «flash» в браузере? - PullRequest
1 голос
/ 08 ноября 2011

Для более подробного объяснения у меня есть следующий код в макете приложения Rails:

<!-- Stuff omitted -->
<% unless flash.empty? %>
  <%= flash.each do |name, msg| %>
    <%= content_tag :div, msg, :id => "flash_#{name}" %>
  <% end %>
<% end %>
<%= yield %>

И для контроллера:

#stuff omitted
def create
  user = User.authenticate(params[:email], params[:password])
  if user
    session[:user_id] = user.id
    redirect_to root_url, :notice => "Logged in!"
  else
    flash.now.alert = "Invalid email or password"
    render :new
  end
end

Хорошо, так что, если мне случится ошибкааутентификация, вот что я вижу в браузере:

content_tag error?

Можете ли вы, ребята, сказать мне, почему хэш ({: alert => "Неверный адрес электронной почты или пароль"}) появляется под сообщением?Я действительно не знаю, что не так,

(Кстати, это взято из Rails Casts # 250)

Ответы [ 3 ]

4 голосов
/ 08 ноября 2011

Просто удалите знак равенства из начала цикла:

<!-- Stuff omitted -->
<% unless flash.empty? %>
  <% flash.each do |name, msg| %>
    <%= content_tag :div, msg, :id => "flash_#{name}" %>
  <% end %>
<% end %>
<%= yield %>

Потому что он говорит ERB печатать всю переменную flash.

1 голос
/ 08 ноября 2011

Похоже, сообщение становится хешем.Попробуйте установить флэш-сообщение так:

flash[:alert] = "Invalid email or password"
0 голосов
/ 07 июня 2017

Вы можете попробовать следующее:

  • в application.html.erb вы можете написать:

    <% unless flash.empty? %>
      <% flash.each do |name, msg| %>
        <%= content_tag :div, msg, class: "alert alert-#{name}" %>
      <% end %>
    <% end %>
    <%= yield %>
    
  • в контроллере, который вы можете написать:

    flash[:danger] = "Invalid email or password"

...