【问题标题】:Cannot create a new user using ActiveAdmin with Rails 4无法使用带有 Rails 4 的 ActiveAdmin 创建新用户
【发布时间】:2013-10-24 13:10:59
【问题描述】:

当我尝试使用 Activeadmin 创建新用户时,Rails 抛出以下错误:

NoMethodError in Admin::UsersController#create
undefined method `email' for #<User:0x007fabb13db508>
Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"RS+AP9merlR5RxiKrPxM8Sx9CYEZGn7a4EJ6e25DL6Q=",
 "user"=>{"username"=>"user1",
 "password"=>"[FILTERED]",
 "password_confirmation"=>"[FILTERED]"},
 "commit"=>"Create User"}

一些背景信息:我已经安装了 Activeadmin 并且除了默认的 admin_user 资源,我使用 Devise 创建了一个用户模型并将这个用户模型注册为一个 Activeadmin 资源。我希望我的用户使用用户名而不是电子邮件进行身份验证,因此我进行了以下迁移:

def up
  add_column :users, :username, :string
  add_index :users, :username, unique: true, name: 'index_users_on_username', using: 'btree'
  remove_column :users, :email, :string
end

def down
  remove_column :users, :username, :string
  remove_index :users, :username
  add_column :users, :email, :string
end

在我设置的设计初始化器中:

config.authentication_keys = [ :username ]
config.case_insensitive_keys = [ :username ]
config.strip_whitespace_keys = [ :username ]

我还在 Activeadmin 中对登录表单和用户资源的表单进行了适当的自定义:

ActiveAdmin.register User do
  index do
    column :username
    default_actions
  end

  filter :username

  form do |f|
    f.inputs "Admin Details" do
      f.input :username
      f.input :password
      f.input :password_confirmation
    end
    f.actions
  end

  controller do
    def permitted_params
      params.permit admin_user: [:username, :password, :password_confirmation]
    end
  end
end

我无法确定这是 Devise、Activeadmin、Postgres 还是 Rails 问题。此外,我不确定在哪里可以找到 Admin::UsersController。任何帮助将不胜感激。

附:在 Rails 控制台中创建新用户:

User.create(username: 'John', password: '123456', password_confirmation: '123456')

抛出类似的错误:

NoMethodError: undefined method `email' for #<User:0x007fabb6806da8>

更新 1:

@Sparda:我将此添加到我的用户模型中(在 app/models/user.rb 下):

def self.find_first_by_auth_conditions(warden_conditions)
  conditions = warden_conditions.dup
  if username = conditions.delete(:username)
    where(conditions).where(["lower(username) = :value", { :value => username.downcase }]).first
  else
    where(conditions).first
  end
end

重启了服务器,还是出现了同样的错误。

@Adeptus:我在 add/admin/user.rb 中添加了这两个方法。现在发生以下情况 - 当我填写表单并单击创建用户时,页面刷新,表单字段被删除,只有密码字段 can't be blank 周围出现闪存错误。顺便说一句,我已经遇到过这种行为。我试图阅读用户表中的电子邮件列,但同样的事情发生了。

【问题讨论】:

  • 把这个写在你的User 模型中,让我知道会发生什么,如果可行,我会写一个完整的答案def self.find_first_by_auth_conditions(warden_conditions) conditions = warden_conditions.dup if username = conditions.delete(:username) where(conditions).where(["lower(username) = :value", { :value =&gt; username.downcase }]).first else where(conditions).first end end
  • @Sparda - 我回答了你的建议作为我问题的更新。
  • 好吧,我不会有任何帮助......我唯一可以告诉你的是,我真的认为这来自设计,因为在控制台中创建用户会引发同样的错误。你应该朝这个方向看。
  • 谢谢。我看到where 你采纳了你的建议。感谢您的帮助。
  • 我使用的是 Rails 4,它运行良好,where 仍然可以像以前一样使用。但是,如果您在其他地方使用 MetaWhere,您实际上可能希望将其替换为 Squeel。否则你不需要任何一个。

标签: ruby-on-rails postgresql devise activeadmin


【解决方案1】:

添加到您的模型中:

def email_required?
  false
end

def email_changed?
  false
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多