在 process_action 回调之前:require_no_authentication 尚未定义

Posted

技术标签:

【中文标题】在 process_action 回调之前:require_no_authentication 尚未定义【英文标题】:Before process_action callback :require_no_authentication has not been defined 【发布时间】:2018-04-15 21:11:02 【问题描述】:

我试图在第一次注册时确认用户,但用户不断收到此错误。当他收到确认电子邮件并单击它时。他得到以下错误

error.log

Started GET "/users/confirmation?confirmation_token=zu1phZ8TaJHNFDJcXWvE" for 127.0.0.1 at 2017-11-03 13:00:02 +0530
   (4.2ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC

ArgumentError (Before process_action callback :require_no_authentication has not been defined):

app/controllers/confirmations_controller.rb:2:in `<class:ConfirmationsController>'
app/controllers/confirmations_controller.rb:1:in `<top (required)>'

confirmations_controller.rb

class ConfirmationsController <  Devise::ConfirmationsController
  skip_before_action :require_no_authentication!
  skip_before_action :authenticate_user!

end

首先我以为我没有这个 require_no_authentication! 方法。所以我尝试将此方法的代码放在控制器本身中,但它仍然不起作用。

class ConfirmationsController <  Devise::ConfirmationsController
  skip_before_action :require_no_authentication!
  skip_before_action :authenticate_user!

  private
  def require_no_authentication!
    assert_is_devise_resource!
    return unless is_navigational_format?
    no_input = devise_mapping.no_input_strategies

    authenticated = if no_input.present?
      args = no_input.dup.push scope: resource_name
      warden.authenticate?(*args)
    else
      warden.authenticated?(resource_name)
    end

    if authenticated && resource = warden.user(resource_name)
      flash[:alert] = I18n.t("devise.failure.already_authenticated")
      redirect_to after_sign_in_path_for(resource)
    end
  end

end

routes.rb

Rails.application.routes.draw do
  devise_for :users, controllers: 
    sessions: 'api/v1/sessions',
    registrations: 'api/v1/registrations',
    passwords: 'api/v1/passwords',
    :confirmations => "confirmations" 
  
end

【问题讨论】:

请用几行堆栈跟踪发布错误 我已经更新了我的error.log 【参考方案1】:

似乎应该只是:

:require_no_authentication

:require_no_authentication!

...至少从我刚刚在 Devise docs 上读到的内容来看

【讨论】:

我明白了...好的;让我们尝试调试。 1)你的设计版本是什么? 2) 你能把下面的内容放在skip_before_action :require_no_authentication! 上面吗? --> puts self.methods.grep /require_no/,让我知道输出结果 我已经解决了我的问题,现在我将其作为答案【参考方案2】:

这里是解决方案。我没有跳过我用来检查用户是否有 authentication_token 的 require_login 方法

class ConfirmationsController < Devise::ConfirmationsController
  skip_before_action :require_login!

  def new
    super
  end

  def create
    super
  end

  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_navigational_format?
      sign_in(resource_name, resource)
      respond_with_navigational(resource)  redirect_to after_confirmation_path_for(resource_name, resource) 
    else
      respond_with_navigational(resource.errors, status: :unprocessable_entity)  render :new 
    end
  end

  private

  def after_confirmation_path_for(resource_name, resource)
    if signed_in?(resource_name)
      signed_in_root_path(resource)
    else
      new_session_path(resource_name)
    end
  end
end

【讨论】:

以上是关于在 process_action 回调之前:require_no_authentication 尚未定义的主要内容,如果未能解决你的问题,请参考以下文章

在护照 app.use() 回调中未收到 Req 和 Res 参数

理解 node.js 回调结构

Node.js Mongoose 回调

回调解决未处理的承诺,为啥?

Ajax请求回调地狱及解决方案(promiseasync和await)

Passportjs回调,理解参数[重复]