在模型“未定义的方法‘process_uri’”中未检测到方法
Method not detected in model " undefined method `process_uri' "
我想弄清楚为什么我无法识别我的方法。也许我没有看清楚事情并犯了一些有人可以发现的小错误?这是我的代码,当我点击按钮时出现此错误。
用户模型: 当 if auth.info.image.present?
通过时,会调用 process_uri
但我的方法未被识别。
def self.from_omniauth(auth)
anonymous_username = "NewUser#{User.last.id + 1}"
generated_password = Devise.friendly_token[0,20]
user = User.where(:email => auth.info.email, :username => anonymous_username).first
if user
return user
else
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.confirmed_at = Time.now
user.fullname = auth.info.name
user.provider = auth.provider
user.uid = auth.uid
user.username = anonymous_username
user.email = auth.info.email
user.password = generated_password
end
if auth.info.image.present?
avatar_url = process_uri(auth.info.image)
user.update_attribute(:avatar, URI.parse(avatar_url))
end
end
end
private
def process_uri(uri)
require 'open-uri'
require 'open_uri_redirections'
open(uri, :allow_redirections => :safe) do |r|
r.base_uri.to_s
end
end
如您所见,我在 def process_uri(uri)
下有一个私有方法 ..即使我取出 private 这仍然没有被注意到...谢谢!!
这里的问题是私有方法process_uri
是实例方法,而from_omniauth
是class方法。在 class 方法的上下文中,将调用该方法的 self
对象是 class,而不是实例,因此您会收到未定义的方法错误,因为没有 class方法process_uri
。您可以将 process_uri
定义为 class 方法,也可以将其定义为 public 并在对象本身上调用它(例如 user.process_uri
)。
我想弄清楚为什么我无法识别我的方法。也许我没有看清楚事情并犯了一些有人可以发现的小错误?这是我的代码,当我点击按钮时出现此错误。
用户模型: 当 if auth.info.image.present?
通过时,会调用 process_uri
但我的方法未被识别。
def self.from_omniauth(auth)
anonymous_username = "NewUser#{User.last.id + 1}"
generated_password = Devise.friendly_token[0,20]
user = User.where(:email => auth.info.email, :username => anonymous_username).first
if user
return user
else
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.confirmed_at = Time.now
user.fullname = auth.info.name
user.provider = auth.provider
user.uid = auth.uid
user.username = anonymous_username
user.email = auth.info.email
user.password = generated_password
end
if auth.info.image.present?
avatar_url = process_uri(auth.info.image)
user.update_attribute(:avatar, URI.parse(avatar_url))
end
end
end
private
def process_uri(uri)
require 'open-uri'
require 'open_uri_redirections'
open(uri, :allow_redirections => :safe) do |r|
r.base_uri.to_s
end
end
如您所见,我在 def process_uri(uri)
下有一个私有方法 ..即使我取出 private 这仍然没有被注意到...谢谢!!
这里的问题是私有方法process_uri
是实例方法,而from_omniauth
是class方法。在 class 方法的上下文中,将调用该方法的 self
对象是 class,而不是实例,因此您会收到未定义的方法错误,因为没有 class方法process_uri
。您可以将 process_uri
定义为 class 方法,也可以将其定义为 public 并在对象本身上调用它(例如 user.process_uri
)。