未定义的方法'设计'为用户

Jon*_*man 37 ruby ruby-on-rails devise

我一直在寻求掌握设计及其运作方式,并且在第一道障碍时有点堕落.我已经看了几个地方,但似乎无法找到有这个错误的人.

所以我创建了一个带索引视图的简单Home控制器并添加了root'home #index',并确保在development.rb文件中设置了默认的url选项.然后我输入:

rails generate devise User
Run Code Online (Sandbox Code Playgroud)

这在模型中创建了我的user.rb文件,其中包含以下内容:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end
Run Code Online (Sandbox Code Playgroud)

到目前为止非常简单,我有以下Gemfile:

source 'https://rubygems.org'
gem 'rails', '4.0.5'
gem 'sqlite3'
gem 'sass-rails', '~> 4.0.2'
gem 'devise'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 1.2'
group :doc do
  gem 'sdoc', require: false
end
gem 'bcrypt'
Run Code Online (Sandbox Code Playgroud)

当我运行rake db:migrate时,我收到以下错误:

rake aborted!
NoMethodError: undefined method `devise' for User (call 'User.connection' to establish a connection):Class
/home/jonlee/.rvm/gems/ruby-2.1.1@railstutorial_rails_4_0/gems/activerecord-4.0.5/lib/active_record/dynamic_matchers.rb:22:in `method_missing'
/home/jonlee/Projects/rails/userauth/app/models/user.rb:4:in `<class:User>'
/home/jonlee/Projects/rails/userauth/app/models/user.rb:1:in `<top (required)>'
Run Code Online (Sandbox Code Playgroud)

我不知道为什么用户模型无法找到'设计'方法,因为我可以看到它肯定存在.

我在rake路由,rails服务器和rails控制台上遇到了类似的错误.

有关更多信息,我使用ruby 2.1.1,如果这有帮助?

Kir*_*rat 89

添加devise到您的应用程序Gemfile并通过运行安装它bundle install.在此之后,您应该运行以下生成器命令:

rails generate devise:install
Run Code Online (Sandbox Code Playgroud)

该生成器将安装一个初始化程序your_application/config/initializers/devise.rb ,它包含所有Devise的配置选项.

您错过了上述步骤,这就是为什么没有设置设计配置并且您undefined method 'devise' for User在模型类中收到错误的原因User.


mmi*_*ike 17

我有同样的问题,但有其他原因.这对某些人来说也可能是个问题.停止rails服务器,然后键入

 rails s
Run Code Online (Sandbox Code Playgroud)

重新启动


Ste*_*anu 15

我在配置Devise(Ruby 2.4.1/Rails 5.1.2)时遇到了类似的问题.在我的情况下,我执行后似乎没有创建以下文件:rails generate devise:install这是第一次.

create  config/initializers/devise.rb
create  config/locales/devise.en.yml
Run Code Online (Sandbox Code Playgroud)

我遵循的步骤:

1)从您的MODEL中评论以下内容:

  #devise :database_authenticatable, :registerable,
     #:recoverable, :rememberable, :trackable, :validatable
Run Code Online (Sandbox Code Playgroud)

2)来自routes.rb的评论:

#devise_for :sessions
Run Code Online (Sandbox Code Playgroud)

3)rails generate devise:install再次运行,你会看到这次创建了一些文件.希望你的工作!

4)取消1)和2)

5)执行: rake db:migrate

在这一点上,它应该工作.希望它可以帮到某人!


abl*_*bla 14

我运行了发电机,$ rails generate devise:install但遇到了同样的问题.

无论如何它对我有用:添加extend Devise::Models到用户模型.

  • IMO这应该是正确的答案-并不排除使用不在Rails中的Devise的人。通常的模式是将模型保存在共享相同数据库的服务的单独的gem中。 (2认同)

Kev*_*hrt 11

除了Kirti的跑步答案

rails generate devise:install
Run Code Online (Sandbox Code Playgroud)

您可能想要将设计初始化程序重命名为

config/initializers/01_devise.rb
Run Code Online (Sandbox Code Playgroud)

因为如果任何其他初始化程序(例如config/initializers/active_admin.rb)在设计之前运行并触及ApplicationController,您将得到相同的错误.

根据 http://guides.rubyonrails.org/configuring.html#using-initializer-files, 您可以使用文件命名控制初始化程序的加载顺序.


小智 5

我遇到过同样的问题。解决方法是取消注释:

require 'devise/orm/active_record'
Run Code Online (Sandbox Code Playgroud)

config/initializers/active_admin.rb

我之前故意将其注释掉,因为文档说:“支持:active_record(默认)”。

  • 在我使用 gem `devise_token_auth` 的情况下,我必须将它添加到 `config/devise_token_auth.rb` (4认同)