【问题标题】:Replace devise_error_messages! with flash messages替换 devise_error_messages!带有闪信息
【发布时间】:2015-05-11 21:37:32
【问题描述】:

我使用 rails g devise:views users 生成了我的设计视图

我使用 rails g devise:controllers users 生成了我的设计控制器

我在routes.rb 中添加了我的新控制器:

  devise_for :users, controllers: { sessions: "users/sessions", 
                                    confirmations: "users/confirmations",
                                    registrations: "users/registrations", 
                                    passwords: "users/passwords",
                                    unlocks: "users/unlocks"}

我根据这个答案更改了我的闪存消息以处理数组:rails - Devise - Handling - devise_error_messages

像这样:

<% flash.each do |key, value| %>
    <% if value.class == Array %>
        <% value.each do |message| %>
            <div class="<%= flash_class(key) %>">
                <%= message %>
            </div>
        <% end %>
    <% else %>
        <div class="<%= flash_class(key) %>">
            <button type="button" class="close" data-dismiss="alert">×</button>
            <%= value %>
        </div>

    <% end %>

<% end %>

我的新自定义注册控制器:

class Users::RegistrationsController < Devise::RegistrationsController
# before_filter :configure_sign_up_params, only: [:create]
# before_filter :configure_account_update_params, only: [:update]

  # GET /resource/sign_up
  # def new
  #   super
  # end

  # POST /resource
  # def create
  #   super
  # end

  # GET /resource/edit
  # def edit
  #   super
  # end

  # PUT /resource
  # def update
  #   super
  # end

  # DELETE /resource
  # def destroy
  #   super
  # end

  # GET /resource/cancel
  # Forces the session data which is usually expired after sign
  # in to be expired now. This is useful if the user wants to
  # cancel oauth signing in/up in the middle of the process,
  # removing all OAuth session data.
  # def cancel
  #   super
  # end

  # protected

  # You can put the params you want to permit in the empty array.
  # def configure_sign_up_params
  #   devise_parameter_sanitizer.for(:sign_up) << :attribute
  # end

  # You can put the params you want to permit in the empty array.
  # def configure_account_update_params
  #   devise_parameter_sanitizer.for(:account_update) << :attribute
  # end

  # The path used after sign up.
  # def after_sign_up_path_for(resource)
  #   super(resource)
  # end

  # The path used after sign up for inactive accounts.
  # def after_inactive_sign_up_path_for(resource)
  #   super(resource)
  # end
  flash[:notice] = flash[:notice].to_a.concat resource.errors.full_messages
end

当我添加这一行时:

flash[:notice] = flash[:notice].to_a.concat resource.errors.full_messages

我得到这个错误:

Users::RegistrationsController:Class 的未定义局部变量或方法“flash”

【问题讨论】:

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


    【解决方案1】:

    我仍然不明白上述解决方案出了什么问题,但找到了一个我认为更好的解决方案:

    第 1 步:

    创建一个文件devise_helper.rb,在其中覆盖devise_error_messages! 方法并将所有错误复制到一个闪存通知数组

    module DeviseHelper
      def devise_error_messages!
        if resource.errors.full_messages.any?
            flash.now[:error] = resource.errors.full_messages
        end
        return ''
      end
    end
    

    第 2 步:

    application_helper.rb 中定义一个新方法,用于配置您的 html 类以进行引导:

    def flash_class(level)
        case level
            when 'notice' then "alert alert-dismissable alert-info"
            when 'success' then "alert alert-dismissable alert-success"
            when 'error' then "alert alert-dismissable alert-danger"
            when 'alert' then "alert alert-dismissable alert-danger"
        end
    end
    

    第 3 步:

    配置您的 Flash 通知以解析数组:

    <% flash.each do |key, value| %>
        <% if value.class == Array %>
            <div class="<%= flash_class(key) %>">
                <button type="button" class="close" data-dismiss="alert">×</button>
                <% value.each do |message| %>  
                    <%= message %>
                    </br>
                <% end %>
            </div>
        <% else %>
            <div class="<%= flash_class(key) %>">
                <button type="button" class="close" data-dismiss="alert">×</button>
                <%= value %>
            </div>
        <% end %>
    <% end %>
    

    第四步

    确保在您的设计注册视图中调用新的devise_error_messages!,它将所有错误添加到闪存消息中,然后可以使用您的闪存渲染布局(在我的情况下为_error.html.erb)显示:

    <h2>Sign up</h2>
    
    <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
      <%= devise_error_messages! %>
      <%= render 'layouts/error' %>
      <div class="field">
        <%= f.label :email %><br />
        <%= f.email_field :email, autofocus: true %>
      </div>
    
      <div class="field">
        <%= f.label :password %>
        <% if @validatable %>
        <em>(<%= @minimum_password_length %> characters minimum)</em>
        <% end %><br />
        <%= f.password_field :password, autocomplete: "off" %>
      </div>
    
      <div class="field">
        <%= f.label :password_confirmation %><br />
        <%= f.password_field :password_confirmation, autocomplete: "off" %>
      </div>
    
      <div class="actions">
        <%= f.submit "Sign up" %>
      </div>
    <% end %>
    
    <%= render "users/shared/links" %>
    

    【讨论】:

    • 我会放弃应用程序帮助程序 flash_class,只写视图中的密钥。:class="alert alert-dismissable alert-&lt;% key %&gt;" 你的 CSS 中需要更多的类,但我认为它更干燥。
    【解决方案2】:

    更干一点 - 没有应用程序助手 flash_card 和重复 html 的视图:

    在你的 CSS 中添加 .alert-error

    <% flash.each do |key, value| %>
        <div class="alert alert-dismissable alert-<% key %>">
            <button type="button" class="close" data-dismiss="alert">×</button>
            <% if value.class == Array %>
                <% value.each do |message| %>  
                    <%= message %>
                    </br>
                <% end %>
            <% else %>
                <%= value %>
            <% end %>
        </div>
    <% end %>
    

    【讨论】:

      【解决方案3】:

      因为不管是数组我都可以省略IF,所以我喜欢这样写。

      <% flash.each do |key, value| %>
        <div class="alert alert-dismissable alert-<% key %>">
          <button type="button" class="close" data-dismiss="alert">×</button>
          <% [*value].each do |message| %>  
            <%= message %></br>
          <% end %>
        </div>
      <% end %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-02
        • 2012-12-17
        • 1970-01-01
        • 2019-12-28
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多