我的Rails应用程序中出现以下错误,我不知道如何调试或修复它:
NoMethodError in AuthenticationsController#创建
当你没有时,你有一个零对象 期待它!你可能已经预料到了 ActiveRecord :: Base的实例。该 评估nil。[]
时发生错误Rails.root: /Users/phil/Sites/travlrapp.com 应用程序跟踪|框架跟踪| 完整跟踪
应用程序/控制器/ authentications_controller.rb:15:在 `创建'
控制器是:
class AuthenticationsController < ApplicationController
def index
@authentications = current_user.authentications if current_user
end
def create
omniauth = request.env["omniauth.auth"]
unless omniauth
redirect_to authentications_url
flash[:notice] = "Could not authenticate via #{params['provider']}."
end
authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
if authentication
flash[:notice] = "Signed in successfully."
sign_in_and_redirect(:user, authentication.user)
elsif current_user
current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'], :token => omniauth['credentials']['token'], :secret => omniauth['credentials']['secret'])
flash[:notice] = "Authentication successful."
redirect_to authentications_url
else
user = User.new
user.apply_omniauth(omniauth)
if user.save
flash[:notice] = "Signed in successfully."
sign_in_and_redirect(:user, user)
else
session[:omniauth] = omniauth.except('extra')
redirect_to new_user_registration_url
end
end
end
def destroy
@authentication = current_user.authentications.find(params[:id])
@authentication.destroy
flash[:notice] = "Successfully destroyed authentication."
redirect_to authentications_url
end
end
OmniAuth过去工作正常,然后我把它捣乱,试图通过支持flickr的pchilton交换到一个分支。我这样做是通过设置:git =&gt;在gemfile中尝试重新安装,但我不自信我做得对。
我现在已经手动删除了所有omniauth和oa-foo gem文件,并首先安装了当前的stable(0.1.6)和git master副本,但所有错误都是相同的。
在这里真的不知所措,我知道的任何人都不知道问题是什么。
答案 0 :(得分:2)
omniauth
可能是nil
。当您使用unless onmniauth
检查nil时,redirect_to
实际上并未停止执行下面的控制器代码。
你可能想要这样的东西:
unless omniauth
redirect_to authentications_url
flash[:notice] = "Could not authenticate via #{params['provider']}."
return
end
现在,您仍需要确定omniauth
为nil
的原因。为此,请确保通过查看README正确使用OmniAuth。 /auth/provider/callback
是否已转到AuthenticationsController#create
?
答案 1 :(得分:1)
如果您已经知道这种方法,我会提前道歉(毕竟您是一名php开发人员)。
rails是否支持与die()
类似的php样式调试?我在yii和kohana php框架中遇到了类似这样奇怪的难以理解的错误。
我所做的是在控制器acion的末尾添加一个die('AAAAA')
,然后逐渐向上移动,直到 IT 在错误出现之前被触发,这样我就确切地知道了什么排错误。
然后我将它移动到该行上调用的任何函数中并重新开始。
我不知道rails是否支持这种原始调试方式。如果这些宝石的源代码在非编译代码中也是有帮助的,那么你可以像这样在所有地方插入die()
。
您可以执行类似echo 'AAA'; exit;
或类似内容的操作。
还有'检查函数是否被调用:die('BBBBB');
:P
如果你想要真正进步,还有
die("AAAAA ".' '.__FILE__.'::Line:'.__LINE__);
答案 2 :(得分:1)
这似乎是随机修复的。 Go Rails!