Rails设计注册形式未定义的方法`devise_error_messages!'

时间:2015-09-18 19:02:03

标签: ruby-on-rails ruby devise

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

我想在我的root url root注册表格' 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

视图/家/ 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>
     

当我尝试使用错误的属性注册时,它会向我显示此错误

  

未定义的方法`devise_error_messages!&#39;对于#&lt;#:0x007fb430638300&gt;

如何修复此错误。也是使用Devise模块的好习惯吗?

4 个答案:

答案 0 :(得分:5)

最好的选择是将您自己的DeviseHelper重命名为其他内容。 Rails的自动加载是找到DeviseHelper而不是Devise的实现,因此该方法没有被加载。称之为不太具体的东西,例如化AuthHelper。

这样做的好处在于你自己实现了devise_error_messages!是因为你会自动选择Devise在未来版本中可能做出的方法的更改,以及你的应用程序中的代码更少,这使得你的代码更加合理/可维护。

答案 1 :(得分:0)

从文档Devise wiki

中查看此链接

答案 2 :(得分:0)

只需向devise_error_messages!添加DeviseHelper的实施。您可以从Devise wiki借用实现。

答案 3 :(得分:0)

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

P.S。我已经在我的一个项目中使用了它并且工作正常。