设计投掷:
"NoMethodError (undefined method `login' for #<ActionDispatch::Request:0x00000004e42d80>):
"
每次我尝试登录 在此应用程序中,“登录”字段用作身份验证密钥:
/config/initializers/devise.rb:
config.authentication_keys = [ :login ]
在session_controller.rb中,我使用了before_filter
:
def configure_permitted_parameters
devise_parameter_sanitizer.for(:user) { |u| u.permit(:login, :password) }
end
我的routes.rb
:
devise_for :users, :controllers => { :sessions => 'sessions', :registrations => 'registrations', :invitations => 'users/invitations'}
从Rails 3升级到Rails 4后出现此问题。 有人可以向我解释一下,我做错了吗?
更新
我的坏。在设计初始化程序中找到错误的参数,由我的同事设置。 无论如何,我有错误信息:
NameError (undefined local variable or method `invitation_token' for #<User:0x0000000286c750>):
app/controllers/sessions_controller.rb:6:in `create'
会话#创建:
def create
self.resource = warden.authenticate!(auth_options)
sign_in(resource_name, resource)
render :json => { :user_id => resource.id }, :status => :created
end
更新
垃圾。我的同事也将database.yml更改为另一个DB。所以这个数据库没有迁移到最后的状态=。 rake db:migrate之后一切正常。谢谢大家。
答案 0 :(得分:0)
根据此link,您应该在用户模型中创建登录虚拟属性。
#Virtual attribute for authenticating by either username or email
#This is in addition to a real persisted field like 'username'
attr_accessor :login
还为rails 3
添加登录attr_accessibleattr_accessible :login
您可能还需要在用户模型中覆盖Devise的find_for_database_authentication方法 (假设它是activerecord)
# app/models/user.rb
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first
else
where(conditions).first
end
end
您可能需要修改config / initializers / devise.rb才能拥有
config.reset_password_keys = [ :login ]
config.confirmation_keys = [ :login ]