【问题标题】:Authentication with Omni and Devise - error after confirming email for twitter auth使用 Omni 和 Devise 进行身份验证 - 确认 twitter auth 的电子邮件后出错
【发布时间】:2014-10-01 05:13:56
【问题描述】:

我正在关注这个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

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

【问题讨论】:

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


    【解决方案1】:

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

    before_action :set_user,仅:[:show, :edit, :update, :destroy, :finish_signup]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      相关资源
      最近更新 更多