在 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 参数