使用Omni和Devise进行身份验证 - 确认twitter auth的电子邮件后出错

时间:2014-08-07 20:13:00

标签: ruby-on-rails ruby-on-rails-4 twitter devise omniauth

我正在关注此tutorial - Rails 4 OmniAuth using Devise with Twitter, Facebook and Linkedin

一切正常,直到我在使用twitter进行身份验证时确认我的电子邮件。我收到以下错误:

NoMethodError in UsersController#finish_signup
undefined method `update' for nil:NilClass

Extracted source (around line #34):

    # authorize! :update, @user 
    if request.patch? && params[:user] #&& params[:user][:email]
 #34     if @user.update(user_params)
            @user.skip_reconfirmation!
            sign_in(@user, :bypass => true)
            redirect_to @user, notice: 'Your profile was successfully updated.'

user_controller.rb

class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]

  # GET /users/:id.:format
  def show
    # authorize! :read, @user
  end

  # GET /users/:id/edit
  def edit
    # authorize! :update, @user
  end

  # PATCH/PUT /users/:id.:format
  def update
    # authorize! :update, @user
    respond_to do |format|
      if @user.update(user_params)
        @user.skip_reconfirmation!
        sign_in(@user == current_user ? @user : current_user, :bypass => true)
        format.html { redirect_to @user, notice: 'Your profile was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # GET/PATCH /users/:id/finish_signup
  def finish_signup
    # authorize! :update, @user 
    if request.patch? && params[:user] #&& params[:user][:email]
      if @user.update(user_params)
        @user.skip_reconfirmation!
        sign_in(@user, :bypass => true)
        redirect_to @user, notice: 'Your profile was successfully updated.'
      else
        @show_errors = true
      end
    end
  end

  # DELETE /users/:id.:format
  def destroy
    # authorize! :delete, @user
    @user.destroy
    respond_to do |format|
      format.html { redirect_to root_url }
      format.json { head :no_content }
    end
  end

  private
    def set_user
      @user = User.find(params[:id])
    end

    def user_params
      accessible = [ :name, :email ] # extend with your own params
      accessible << [ :password, :password_confirmation ] unless params[:user][:password].blank?
      params.require(:user).permit(accessible)
    end
end

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您需要注册:在控制器的before_action中完成注册,以便您可以访问@user。

before_action:set_user,仅限:[:show,:edit,:update,:destroy,:finish signup]