OmniAuth / Rails - 当你没想到它时,你有一个零对象

时间:2011-01-16 13:04:43

标签: ruby-on-rails ruby ruby-on-rails-3 omniauth

我的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副本,但所有错误都是相同的。

在这里真的不知所措,我知道的任何人都不知道问题是什么。

3 个答案:

答案 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

现在,您仍需要确定omniauthnil的原因。为此,请确保通过查看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!