如何使用类自定义设计错误消息

时间:2012-04-20 06:46:00

标签: ruby-on-rails devise twitter-bootstrap

即时通讯使用twitters bootstrap警报消息。在我的application.html.erb中我有......

            <% flash.each do |key, value| %>
                <div class="alert alert-<%=key%>">
                    <a class="close" data-dismiss="alert">×</a>
                    <%= value %>
                </div>
           <% end %>

通常当我想做一个flash消息时,我会写一些类似

的内容
flash[:success] = "Profile updated"

然而,我不知道如何给设计错误消息一个键和值对。我查看了devise.en.yml但似乎无法将消息与密钥相关联,即:成功,:错误等。 有人可以帮忙吗?谢谢!

4 个答案:

答案 0 :(得分:36)

对于遇到这种情况的人来说,不知道如何使用bootstrap覆盖设计错误消息。

  1. 创建名为
  2. 的文件
      

    /app/helpers/devise_helper.rb

    1. 添加以下代码:
    2. module DeviseHelper
       def devise_error_messages!
        return '' if resource.errors.empty?
      
         messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
         sentence = I18n.t('errors.messages.not_saved',
         count: resource.errors.count,
         resource: resource.class.model_name.human.downcase)
      
         html = <<-HTML
         <div class="alert alert-error alert-block"> <button type="button"
          class="close" data-dismiss="alert">x</button>
          <h4>#{sentence}</h4>
          #{messages}
         </div>
         HTML
      
         html.html_safe
       end
      end
      

答案 1 :(得分:8)

我就是这样做的

<% flash.each do |key, value| %>
<div class="message">
   <div class="alert-message <%= key %> fade in">
    <a class="close" href="#">&times</a>
    <center><strong><%= value %></strong></center>
  </div>
</div>
<% end %>

答案 2 :(得分:2)

我发现最简单的解决方案是在检查:notice:alert时使用所有Flash消息的公共部分来替换必要的bootstrap类。

所以让/views/shared/_alerts.html.erb像这样 -

<% flash.each do |message_type, message| %>
 <div class="alert alert-<%= flash_class_name(message_type) %> alert-dismissable">
  <span><%= message %></span>
  <button type="button" class="close" data-dismiss="alert" aria-label="Close">
    <span aria-hidden="true">&times;</span>
  </button>
 </div>
<% end %>

添加一个帮助方法(我已将它添加到应用程序帮助程序中),如下所示 -

def flash_class_name(name)
  case name
  when "notice" then "success"
  when "alert"  then "danger"
  else name
  end
end

在应用程序布局(或应用程序的父布局)中包含_alerts.html.erb

那就是它!

答案 3 :(得分:0)

事情是devise_error_messages!本身用class='alert'将数据包装到div中,因此表单将有2个具有相同类的嵌套div。按x按钮将关闭嵌套的div,将空div设置为alert。为避免这种情况,您可以省略辅助返回值中的div,如下所示:

module DeviseHelper
  def devise_error_messages!
    return '' if resource.errors.empty?

    messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join

    html = <<-HTML
      <button type="button" class="close" data-dismiss="alert">x</button>
      #{messages}
    HTML

    html.html_safe
  end
end