嗨,我在这里获得双重定向
我一直试图完成的是自动登录用户并将用户重定向到特定路径,而不是根路径。
在我的registrations_controller.rb
中def new
@user = User.new
end
def create
@user = User.new params[:user]
@valid = @user.save
if @valid
sign_up
end
respond_to do |format|
format.js { render layout: false }
end
end
def sign_up
sign_in(resource_name, resource)
respond_with resource, :location => after_sign_up_path_for(resource)
end
在我的application_controller.rb
中def after_sign_in_path_for(resource)
if resource.admin? or resource.super_admin?
admin_index_path
else
if mobile_device?
page_path("backgroundinfo")
else
page_path("howto")
end
end
end
def after_sign_up_path_for(resource)
page_path("howto")
end
任何变通办法都将受到赞赏。
PS:删除respond_with resource, :location => after_sign_up_path_for(resource)
仍然会将用户重定向到root_path
而不是page_path
,因为控制器操作正在注册?
答案 0 :(得分:0)
当您尝试从同一请求渲染两个模板时,会发生双重渲染错误。
您的sign_up
方法会尝试使用respond_with
块进行回复,之后您的create
方法会尝试从respond_to
块进行另一个响应。这是问题所在:
if @valid
sign_up
end
这将调用您尝试呈现响应的sign_up
方法。发生这种情况后,以下块尝试呈现另一个模板:
respond_to do |format|
format.js { render layout: false }
end
您的执行路径会尝试两次render
次调用,这会导致双重渲染错误。
您的代码看起来应该是这样的:
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
# sign in user here and render response for success
format.js { #handle js }
format.html { #handle html }
else
# user was not saved
format.js { #handle error }
format.html { #handle error }
end
end
end
答案 1 :(得分:0)
我有同样的问题,并通过覆盖Devise :: SessionsController来绕过它,如下所示:
class SessionsController < Devise::SessionsController
def new
self.resource = resource_class.new(sign_in_params)
clean_up_passwords(resource)
#yield resource if block_given?
#respond_with(resource, serialize_options(resource))
# The rest of your code
# your redirect
redirect_to '/'
end
我不确定这是否有任何负面影响,但它似乎工作正常,并且还阻止它将用户登录数据附加到网址。