【问题标题】:Trying to create an Admin user in devise, but I am getting an error尝试在设计中创建管理员用户,但出现错误
【发布时间】:2015-12-17 18:18:46
【问题描述】:

我已经设置并创建了一个用户模型,现在我正在尝试设置一个管理员,但没有任何运气。首先,我按照设计文档中的步骤进行操作:

$ rails generate devise Admin

将我的管理模型更新为:

class Admin < ActiveRecord::Base
 devise :database_authenticatable, :registrable, :trackable, :timeoutable, :lockable  
end

然后我将迁移更新为:

class DeviseCreateAdmins < ActiveRecord::Migration
  def self.up
    create_table(:admins) do |t|
      t.string :email,              :null => false, :default => ""
      t.string :encrypted_password, :null => false, :default => ""
      t.integer  :sign_in_count, :default => 0
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip
      t.integer  :failed_attempts, :default => 0 # Only if lock strategy is      :failed_attempts
      t.string   :unlock_token # Only if unlock strategy is :email or :both
      t.datetime :locked_at
      t.timestamps
    end
  end

  def self.down
    drop_table :admins
  end
end

然后我转到 /admins/sign_up 并收到此错误:

NoMethodError in Devise::Registrations#new
undefined method `title' for #<Admin:0x00000005fb17b0>
<%= f.text_field :title, autofocus: true %>

是否真的必须定义标题,或者是其他原因造成的? 有没有更好的方法在设计中创建单个管理员帐户?

【问题讨论】:

    标签: ruby-on-rails ruby devise admin


    【解决方案1】:

    您没有为您的 Admin 模型(管理员表)创建 title 列 - 因此异常。

    您应该阅读有关在 Rails 中向表中添加列的信息。

    要解决此特定问题,请创建新迁移:

    rails g migration add_title_to_admins
    

    在生成的文件中:

    add_column :admins, :title, :string
    

    运行迁移:

    rake db:migrate
    

    现在您的管理员将拥有title。要添加新属性(db 中的列),请按照 title 的说明进行操作。

    【讨论】:

      【解决方案2】:

      正如 Andrey 指出的那样,您必须将 title 列添加到您的 Admin 表中,然后(如果 Rails 3)在 Admin 模型中将其设为 attr_accessible,否则(如果 Rails 4)@987654322 @。

      有没有更好的方法在 devise 中创建单个管理员帐户?

      是的,有更好的方法来处理管理员帐户。您应该使用rolify gem。它与设计无缝集成,您不需要为管理员提供一个完整的单独表格。这是一个例子:

      user = User.find(1)
      user.add_role :admin # sets a global role
      user.has_role? :admin
      => true
      

      【讨论】:

      • attr_accessible? khm-khm .. :)
      • @AndreyDeineko 嗯,我应该更具体,对吧?如果 OP 使用 Rails 3,则需要 attr_accessible,但如果是 Rails 4,则需要在控制器中将其列入白名单。
      • rails 5即将发布,希望大家不要随意使用rails 3