当我尝试使用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。任何帮助将不胜感激。
P.S。在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
周围出现闪存错误。顺便说一句,我已经遇到过这种行为。我尝试读取users表中的email列,但同样的事情发生了。
答案 0 :(得分:2)
添加到您的模型中:
def email_required?
false
end
def email_changed?
false
end