Rails +设计sign_in错误

时间:2014-03-26 06:31:03

标签: ruby-on-rails authentication devise

设计投掷:

"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之后一切正常。谢谢大家。

1 个答案:

答案 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_accessible
attr_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 ]