在Devise中注册后尝试自动登录并将用户重定向到特定路径时出现双重渲染错误

时间:2013-09-19 14:50:46

标签: ruby-on-rails devise

嗨,我在这里获得双重定向

我一直试图完成的是自动登录用户并将用户重定向到特定路径,而不是根路径。

在我的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,因为控制器操作正在注册?

2 个答案:

答案 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

我不确定这是否有任何负面影响,但它似乎工作正常,并且还阻止它将用户登录数据附加到网址。