Ruby on rails 未定义的局部变量或方法“signin';对于#<;等级:0x31fa7f0>;

Ruby on rails 未定义的局部变量或方法“signin';对于#<;等级:0x31fa7f0>;,ruby-on-rails,ruby,devise,Ruby On Rails,Ruby,Devise,我在模型类中有以下错误。如何处理这些错误 class User < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :r

我在模型类中有以下错误。如何处理这些错误

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessor :signin
  validates :username, :uniqueness => {:case_sensitive => false}

  def self.find_first_by_auth_conditions(warden_conditions)
    puts warden_conditions
    conditions = warden_conditions.dup
    where(conditions).where(["lower(username) = :value OR 
            lower(email)= :value", { :value => signin.downcase }]).first
  end

end  
class用户{:区分大小写=>false}
定义self.find_first_by_auth_条件(典狱长条件)
把监狱长的情况
条件=典狱长_conditions.dup
其中(条件)。其中([“下(用户名)=:值或
lower(email)=:value“,{:value=>signin.downcase}])。首先
结束
结束

我不熟悉rails,从实践中学习。如何调试此类问题。如果我在模型中遇到这样的错误,我应该首先看哪里。

这个方法来自
design
,用于通过配对用户名和电子邮件或其他方式进行身份验证。 您在
signin
变量中遇到问题,我使用
login
查看我的代码:

def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      if login.start_with?('+')
        where(["phone = :value AND phone_confirm = :phone_confirm", { value: login.downcase, phone_confirm: true }]).first
      else
        where(["lower(email) = :value", { value: login.downcase }]).first
      end
    else
      where(conditions).first
    end
  end

此方法来自
designe
,用于通过配对用户名和电子邮件或其他方式进行身份验证。 您在
signin
变量中遇到问题,我使用
login
查看我的代码:

def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      if login.start_with?('+')
        where(["phone = :value AND phone_confirm = :phone_confirm", { value: login.downcase, phone_confirm: true }]).first
      else
        where(["lower(email) = :value", { value: login.downcase }]).first
      end
    else
      where(conditions).first
    end
  end

此方法来自
designe
,用于通过配对用户名和电子邮件或其他方式进行身份验证。 您在
signin
变量中遇到问题,我使用
login
查看我的代码:

def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      if login.start_with?('+')
        where(["phone = :value AND phone_confirm = :phone_confirm", { value: login.downcase, phone_confirm: true }]).first
      else
        where(["lower(email) = :value", { value: login.downcase }]).first
      end
    else
      where(conditions).first
    end
  end

此方法来自
designe
,用于通过配对用户名和电子邮件或其他方式进行身份验证。 您在
signin
变量中遇到问题,我使用
login
查看我的代码:

def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      if login.start_with?('+')
        where(["phone = :value AND phone_confirm = :phone_confirm", { value: login.downcase, phone_confirm: true }]).first
      else
        where(["lower(email) = :value", { value: login.downcase }]).first
      end
    else
      where(conditions).first
    end
  end

attr\u accessor:signin
为类实例定义一个访问器

问题是您试图在类方法的作用域中访问它,因此它是未定义的。您想要的功能是基于以下两部分执行查询:

  • 监狱长
  • 用户名资料
我建议实施两个新范围(或一个)

并将您的方法实现为

def self.find_first_by_auth_conditions(warden_conditions, user)
  warden_stuff(warden_conditions).user_stuff(user).first
  # or where(warden_conditions).user_stuff(user).first
end
因此,它可以用作

user=user.find\u first\u by\u auth\u conditions(the\u conditions.dup,a\u user)
attr\u accessor:signin
定义类实例的访问器

问题是您试图在类方法的作用域中访问它,因此它是未定义的。您想要的功能是基于以下两部分执行查询:

  • 监狱长
  • 用户名资料
我建议实施两个新范围(或一个)

并将您的方法实现为

def self.find_first_by_auth_conditions(warden_conditions, user)
  warden_stuff(warden_conditions).user_stuff(user).first
  # or where(warden_conditions).user_stuff(user).first
end
因此,它可以用作

user=user.find\u first\u by\u auth\u conditions(the\u conditions.dup,a\u user)
attr\u accessor:signin
定义类实例的访问器

问题是您试图在类方法的作用域中访问它,因此它是未定义的。您想要的功能是基于以下两部分执行查询:

  • 监狱长
  • 用户名资料
我建议实施两个新范围(或一个)

并将您的方法实现为

def self.find_first_by_auth_conditions(warden_conditions, user)
  warden_stuff(warden_conditions).user_stuff(user).first
  # or where(warden_conditions).user_stuff(user).first
end
因此,它可以用作

user=user.find\u first\u by\u auth\u conditions(the\u conditions.dup,a\u user)
attr\u accessor:signin
定义类实例的访问器

问题是您试图在类方法的作用域中访问它,因此它是未定义的。您想要的功能是基于以下两部分执行查询:

  • 监狱长
  • 用户名资料
我建议实施两个新范围(或一个)

并将您的方法实现为

def self.find_first_by_auth_conditions(warden_conditions, user)
  warden_stuff(warden_conditions).user_stuff(user).first
  # or where(warden_conditions).user_stuff(user).first
end
因此,它可以用作

user=user。首先通过身份验证条件(the_conditions.dup,a_user)查找[u]

我在通过“Rails学习设备”电子书学习时遇到了完全相同的问题

问题

singin
实际上是一个未定义的局部变量,即调用的方式

解决方案

warden_conditions
是包含登录密钥的哈希。使用此哈希而不是局部变量。正确代码如下:

def self.find_first_by_auth_conditions(warden_conditions)
    where(["lower(username) = :value OR lower(email) = :value", { :value => warden_conditions[:signin].downcase }]).first
end
注意: 我删除了第一个
where
方法,因为
signin
不是数据库中的一列。因此,我认为调用第一个
where
方法没有意义

我还删除了
conditions=warden_conditions.dup
,因为没有必要.dup(复制)warden_条件散列,因为在这种特殊情况下,没有必要担心他的保存问题

但是要小心,如果您通过
warden_conditions
散列传递多个参数,那么您需要将第一个参数保留在何处,然后需要复制散列,以便删除
signin
键。然后使用备份的
登录
键的第二个where


对我来说,这非常有效。

在学习“Rails学习设计”电子书时,我遇到了完全相同的问题

问题

singin
实际上是一个未定义的局部变量,即调用的方式

解决方案

warden_conditions
是包含登录密钥的哈希。使用此哈希而不是局部变量。正确代码如下:

def self.find_first_by_auth_conditions(warden_conditions)
    where(["lower(username) = :value OR lower(email) = :value", { :value => warden_conditions[:signin].downcase }]).first
end
注意: 我删除了第一个
where
方法,因为
signin
不是数据库中的一列。因此,我认为调用第一个
where
方法没有意义

我还删除了
conditions=warden_conditions.dup
,因为没有必要.dup(复制)warden_条件散列,因为在这种特殊情况下,没有必要担心他的保存问题

但是要小心,如果您通过
warden_conditions
hash传递了不止一个参数,那么您需要保留第一个参数