Rails Devise 注册表单未定义的方法"devise_error_messages!



我正在尝试使用设计来处理用户登录/注册/忘记密码

我想有注册表单在我的根url根'home#index'

HomeController

class HomeController < ApplicationController
    include DeviseHelper
    def index
    end
end

DeviceHelper

module DeviseHelper
    def resource_name
       :user
     end
     def resource_class 
        User 
     end
     def resource
       @resource ||= User.new
     end
     def devise_mapping
       @devise_mapping ||= Devise.mappings[:user]
     end
end

视图/home/index.html.erb

  <%= form_for(resource, as: resource_name, url: registration_path(resource_name))  do |f| %>
<%= devise_error_messages! %>
<div class="field">
  <%= f.label :email %><br />
  <%= f.email_field :email, autofocus: true %>
</div>
<div class="field">
  <%= f.label :password %>
  <% if @minimum_password_length %>
  <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>

当我尝试注册错误的属性时它会显示这个错误

未定义方法' device_error_messages !' for #<#:0x007fb430638300>

我如何修复这个错误。另外,使用设计模块是好的做法吗?

最好的选择是将您自己的devicehelper重命名为其他名称。Rails的自动加载会找到你的设计助手的实现,而不是设计的实现,所以这个方法没有被加载。给它起个不那么具体的名字,比如AuthHelper。

这比您自己实现的优点是做了device_error_messages !你将自动选择在未来版本中可能对方法做出的更改,同时你的应用程序中的代码也会减少,这两者都使你的代码更合理/更易于维护。

只需将devise_error_messages!的实现添加到DeviseHelper。您可以从设计wiki借用实现。

app/helpers/devise_helper.rb文件中,像这样添加devise_error_messages!方法:

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
    <div class="alert alert-error alert-danger"> <button type="button"
    class="close" data-dismiss="alert">x</button>
      #{messages}
    </div>
    HTML
    html.html_safe
  end
end

注:

最新更新