我正在使用devise / omniauth。通过facebook / twitter注册后,我想重定向到名为" verify-email"他们可以验证他们的电子邮件地址是否正确。
我只是想让localhost:3000/users/verify-email
页面立即正常工作。我转到那个网址,我收到此错误消息:
找不到路径" / users / update_email"的设计映射。这可能有两个原因:1)您忘记将路径包裹在范围块内。例如:devise_scope:user do get" / some / route" => " some_devise_controller"结束2)您正在测试绕过路由器的Devise控制器。如果是这样,您可以明确告诉Devise使用哪个映射:@ request.env [" devise.mapping"] = Devise.mappings [:user]。
所以这是我的routes.rb:
Rails.application.routes.draw do
...
devise_for :users, :controllers => {
omniauth_callbacks: 'custom_devise_controllers/omniauth_callbacks',
registrations: 'custom_devise_controllers/registrations' }
devise_scope :users do
get "users/verify_email" => 'custom_devise_controllers/registrations#verify_email'
end
...
end
我认为我没有错误地将范围包裹在范围块中(这是错误消息的第1条所述)。这是否意味着我需要明确告诉Devise使用哪个映射(这是错误消息的#2)?错误消息说我可以告诉设计使用哪个映射:@request.env["devise.mapping"] = Devise.mappings[:user].
我应该将它放在我的custom_devise_controllers / registrations_controller.rb中吗?或者你们认为其他事情正在发生吗?
我将包含我的" custom_devise_controllers / registrations_controller.rb":
class CustomDeviseControllers::RegistrationsController < Devise::RegistrationsController
def update
@user = User.find(current_user.id)
successfully_updated = if needs_password?(@user, params)
@user.update_with_password(devise_parameter_sanitizer.sanitize(:account_update))
else
params[:user].delete(:current_password)
@user.update_without_password(devise_parameter_sanitizer.sanitize(:account_update))
end
if successfully_updated
set_flash_message :notice, :updated
sign_in @user, :bypass => true
redirect_to after_update_path_for(@user)
else
render "edit"
end
end
def after_sign_up_path_for(resource)
users_update_email_path
end
def verify_email
end
private
def needs_password?(user, params)
params[:user][:password].present? || params[:user][:password_confirmation].present?
end
end
谢谢!如果你们想知道关于我的代码的更多信息,请告诉我。
答案 0 :(得分:12)
糟糕。
我写道:
devise_scope :users do
应该是:
devise_scope :user do
用户不是用户。