Ruby on rails 注册和身份验证失败时如何重定向设计?
我想要的是,如果有人在注册或登录时输入了错误的信息,将被重定向到默认页面以外的其他页面,比如说Ruby on rails 注册和身份验证失败时如何重定向设计?,ruby-on-rails,ruby,ruby-on-rails-3,devise,Ruby On Rails,Ruby,Ruby On Rails 3,Devise,我想要的是,如果有人在注册或登录时输入了错误的信息,将被重定向到默认页面以外的其他页面,比如说mycontroller\index 在我的应用程序中,我已经跳过了designe::sessioncontroller和designe::RegistrationsController 但我仍然被重定向到注册页面和登录页面。我正在使用Rails 3.2和Desive 3.4.1 这是我的代码…我做错了什么或遗漏了什么?提前谢谢 会话控制器 class SessionsController < D
mycontroller\index
在我的应用程序中,我已经跳过了designe::sessioncontroller
和designe::RegistrationsController
但我仍然被重定向到注册页面和登录页面。我正在使用Rails 3.2和Desive 3.4.1
这是我的代码…我做错了什么或遗漏了什么?提前谢谢
会话控制器
class SessionsController < Devise::SessionsController
def create
resource = warden.authenticate!(:scope => resource_name, :recall => "# {controller_path}#failure")
sign_in_and_redirect(resource_name, resource)
end
def sign_in_and_redirect(resource_or_scope, resource=nil)
scope = Devise::Mapping.find_scope!(resource_or_scope)
resource ||= resource_or_scope
sign_in(scope, resource) unless warden.user(scope) == resource
return render :json => {:success => true}
end
def failure
return render :json => {:success => false, :errors => ["Login failed."]}
end
end
class RegistrationsController < Devise::RegistrationsController
def create
build_resource
if resource.save
if resource.active_for_authentication?
set_flash_message :notice, :signed_up if is_navigational_format?
sign_up(resource_name, resource)
return render :json => {:success => true}
else
set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
expire_session_data_after_sign_in!
return render :json => {:success => true}
end
else
clean_up_passwords resource
return render :json => {:success => false}
redirect_to {:controller=>"deal",:action=>"confirm_and_pay"}
end
end
def sign_up(resource_name, resource)
sign_in(resource_name, resource)
end
end
class ApplicationController < ActionController::Base
protect_from_forgery
def after_sign_up_path_for(resource)
show_deals_path(resource)
end
def after_sign_in_path_for(resource)
sign_in_url = url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http')
if request.referer == sign_in_url
super
else
stored_location_for(resource) || request.referer || root_path
end
end
end
应用程序控制器
class SessionsController < Devise::SessionsController
def create
resource = warden.authenticate!(:scope => resource_name, :recall => "# {controller_path}#failure")
sign_in_and_redirect(resource_name, resource)
end
def sign_in_and_redirect(resource_or_scope, resource=nil)
scope = Devise::Mapping.find_scope!(resource_or_scope)
resource ||= resource_or_scope
sign_in(scope, resource) unless warden.user(scope) == resource
return render :json => {:success => true}
end
def failure
return render :json => {:success => false, :errors => ["Login failed."]}
end
end
class RegistrationsController < Devise::RegistrationsController
def create
build_resource
if resource.save
if resource.active_for_authentication?
set_flash_message :notice, :signed_up if is_navigational_format?
sign_up(resource_name, resource)
return render :json => {:success => true}
else
set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
expire_session_data_after_sign_in!
return render :json => {:success => true}
end
else
clean_up_passwords resource
return render :json => {:success => false}
redirect_to {:controller=>"deal",:action=>"confirm_and_pay"}
end
end
def sign_up(resource_name, resource)
sign_in(resource_name, resource)
end
end
class ApplicationController < ActionController::Base
protect_from_forgery
def after_sign_up_path_for(resource)
show_deals_path(resource)
end
def after_sign_in_path_for(resource)
sign_in_url = url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http')
if request.referer == sign_in_url
super
else
stored_location_for(resource) || request.referer || root_path
end
end
end
如果您想查看这个链接,您应该将其添加到config/initializers/designe.rb中
config.warden do |manager|
manager.failure_app = CustomFailure
end
第一件事是确认是否调用了控制器
'design/registrations#new'
调用designe::sessioncontroller中的'new'方法,而不是您的sessioncontroller。尝试将其替换为“注册#新”
。它应该呼叫您的控制器。您是对的,我没有呼叫我的注册控制器…让我进一步调查一下如何在失败后将会话#create重定向到mycontroller#index…您可以将其放在answer上,我将接受它。