如何向flash添加其他消息[:notice]

时间:2013-07-24 16:29:46

标签: ruby-on-rails ruby-on-rails-3 devise

我正在使用Devise进行身份验证 它总是显示一条闪烁的消息,上面写着“你已经登录了”。签约后通奸。

我在application_controller.rb

中有这个
if current_user.point_added_at.nil? || !current_user.point_added_at.today?
    plus_point(current_user, 100)
    flash[:notice] = "10 points added for today's sign-in"
    current_user.touch :point_added_at
    current_user.save
end

今天首次登录后应显示此Flash消息。

但它只显示Flash消息You're signed in.

如何在首次登录用户后显示两者(或仅为今天的登录添加“10分”)?

更新:

<% flash.each do |name, msg| %>
  <div class="alert alert-<%= name == :notice ? "success" : "error" %>">
    <a class="close" data-dismiss="alert">&#215;</a>
    <%= content_tag :div, msg.html_safe, :id => "flash_#{name}" if msg.is_a?(String) %>
  </div>
<% end %>

1 个答案:

答案 0 :(得分:1)

是的,绝对可以显示您的自定义消息。

但是,首先看看Devise的Sessions #create action

def create
  self.resource = warden.authenticate!(auth_options)
  set_flash_message(:notice, :signed_in) if is_navigational_format?
  sign_in(resource_name, resource)
  respond_with resource, :location => after_sign_in_path_for(resource)
end

set_flash_message行已使用相同的密钥覆盖了您的flash :notice。这就是你的信息无法显示的原因。

要解决,有两种方式:

  1. 覆盖此方法。您可以查看Devise wiki,了解如何执行此操作。然后,在你的新代码#create中,做一些像这样的事情

    unless flash(:notice).present?
      set_flash_message(:notice, :signed_in) if is_navigational_format?
    end
    

    如果有自定义闪存,则会自动保留。

  2. 显示多条Flash消息。这更好,但需要一些工作。首先,为您的自定义消息提供除:notice以外的其他密钥,比如:custom,然后,在您的Flash处理辅助方法中,浏览每对闪存,将正确的CSS类分配给:custom

  3. 添加

    实际上方法2并不难。最简单的代码就像这样

      <% flash.each do |key, value| %>
        <div class="flash <%= key %>"><%= value %></div>
      <% end %>