Devise在我的应用程序中完美运行,除了来自devise.en.yml的flash消息不会显示在视图中。我做错了什么?
以下是我的注册页面视图,我已尝试过:alert
和:notice
但无效。
提前谢谢
<h2>Sign up</h2>
<% if flash[:alert] %>
<%=flash[:alert]%>
<%end%>
<%= form_for(resource,:as=>resource_name,:url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<p><%= f.label :Username %></p>
<p><%= f.text_field :username %></p>
<p><%= f.label :email %></p>
<p><%= f.text_field :email %></p>
<p><%= f.label :password %></p>
<p><%= f.password_field :password %></p>
<p><%= f.label :password_confirmation %></p>
<p><%= f.password_field :password_confirmation %></p>
<p><%= f.submit "Sign up" %></p>
<% end %>
<%= render :partial => "devise/shared/links" %>
答案 0 :(得分:6)
你没有看到任何闪光,因为闪光灯没有设置为任何东西。这似乎是你误解了闪光灯的目的。
将闪存的一般行为设置为当前请求中用户当前会话中的值,然后在后续请求中显示该闪存消息。此模式允许操作设置闪存,重定向到另一个页面,然后在该页面上显示从重定向加载的闪存。然后消耗闪存并从会话中删除。
例外情况是使用flash.now使当前操作可以使用闪存,而不是后续操作。
在您的情况下,闪光灯未显示,因为没有闪光灯显示。加载注册页面不会设置任何Flash消息。闪存在视图中有一个值的唯一方法是,如果某个其他操作重定向到它,在闪存之前设置闪存。像这样的东西
redirect_to new_user_registrations_path, :notice => "This flash will show up on the sign up page"
通常,您不希望在特定视图中调用闪存,而是在应用程序布局中调用闪存。这允许从执行重定向的任何操作设置闪存,并且闪存将显示在随后的页面上。从特定视图设置闪存需要知道特定视图将是重定向中使用的视图。这可能并非总是如此,flash.now将是一个例外,因为它不能重定向。如果我确实需要在特定视图中使用闪存,我不会使用传统的警报/通知闪存变量,因为我会在我的应用程序布局中查找并将导致我的闪存被渲染两次。相反,我可能会将闪光灯设置为
class UsersController < ApplicationController
def custom_action
@user = User.find params[:id]
do_something_with @User
flash[:user] = "Custom action completed!"
redirect_to @user
end
end
然后在我的users / show视图中,我会寻找flash [:custom]并使用与我的布局中的flash处理不同处理的闪存做一些事情。我实际上并没有做过这样的事情,但如果我不得不这样做,我就是这样做的。
答案 1 :(得分:3)
你试过取出闪光灯吗? devise_error_messages应该照顾它们。我的工作没有它,原始的设计视图也没有:https://github.com/plataformatec/devise/blob/master/app/views/devise/registrations/new.html.erb
答案 2 :(得分:0)
&lt;%= render:partial =&gt; &#34;共享/ flash_messages&#34; %GT; 要么 = render&#39; shared / flash_messages&#39; (如果有人使用Haml) 在您的视图文件中查看错误消息或设计:failure:messages