Rails flash: уведомление не работает

#ruby-on-rails #ruby-on-rails-3 #ruby-on-rails-3.1

#ruby-on-rails #ruby-on-rails-3 #ruby-on-rails-3.1

Вопрос:

У меня есть этот код :

 def create
  login(params[:email], params[:password])

  if current_user
    flash[:notice] = "Welcome back #{current_user.email}"
    return redirect_to_first_page
  else
    flash[:notice] = "Email or password is wrong. Try again !"
    redirect_to root_url
  end
end
  

при успешном входе в систему устанавливается flash и выполняется перенаправление на первую страницу.
Эта часть работает. Вторая часть не устанавливает сообщение о флэш-уведомлении. Затем, когда страница отображается, сообщение от flash не отображается. Что отличается от того, что я пытался иметь

 return redirect_to root_url
  

но ничего по-прежнему ничего не показывает.
В моем контроллере у меня есть помощник, такой как flash_notice, все, что он делает, это возвращает flash [: notice] .
Это потому, что флэш-память всегда пуста в представлении, но доступна в контроллере.
В представлении у меня есть только одна строка :

 <%= flash_notice %>
  

Я использую rails 3.1

Комментарии:

1. redirect_to root_url, :notice => "Email or password is wrong. Try again !" Работает ли?

2. Используйте только notice вместо flash_notice

3. @hock, flash_notice это метод на контроллере, определенный OP

4. Может быть, случайно происходит другое перенаправление? Может быть, попробуйте использовать flash[:notice] непосредственно в представлении? Попробуйте распечатать flash на разных этапах в соответствующих контроллерах и представлениях.

5. Я не могу использовать flash[:notice] в представлении, потому что в частичном представлении равно нулю. Я попробовал <%= «flash равен нулю», если flash == nil %>, что было правдой. Единственный способ, которым это сработало для меня, — создать вспомогательный метод в базовом контроллере (например, flash_notice), который возвращает flash[:notice] .

Ответ №1:

Крис Драппье прав, хэш флэш-памяти является текущим только для одного запроса. Вы можете вызвать метод «keep» с помощью

flash.keep[:notice]="This message will persist"

Лично мне нравится сохранять флэш-память, о которой идет речь, в параметрах, когда это необходимо. Кровавые подробности здесь:

http://guides.rubyonrails.org/action_controller_overview.html#the-flash