4

Rails 3.2 と Devise (最新バージョン) を使用しています。

サインイン後に現在ログインしているユーザーのいくつかの変数をテストする場合の主なアイデア。たとえば、ユーザーがアドレスの作成を保留している場合、新しいアドレスパスをリダイレクトしたいとします。しかし、私が得るのは二重レンダリングエラーです。

ここにコードがあります

class ApplicationController < ActionController::Base
  protect_from_forgery

 # Devise: Where to redirect users once they have logged in
  def after_sign_in_path_for(resource)

        if current_user.is? :company_owner
            if $redis.hget(USER_COMPANY_KEY, current_user.id).nil?
                redirect_to new_owner_company_path and return
            else
                @addr_pending = $redis.hget(PENDING_ADDRESS_KEY,current_user.id)
                unless @addr_pending.nil? || !@addr_pending
                     redirect_to owner_company_addresses_path  and return
                end
            end
        end
        root_path
  end
end

私のルート定義

  root :to => "home#index"
    devise_for :users, :controllers => { 
    :omniauth_callbacks => "users/omniauth_callbacks" 
  }
    resources :users, :only => :show

    namespace :owner do
        resource :company  do # single resource /owner/company
            get 'thanks'
            get 'owner' #TODO: esto hay que sacarlo de aquí y forme parte del login
            resources :addresses
        end
    end

したがって、ペディングアドレスを作成したユーザーでログインすると、

"render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".

何が問題なのですか?

 redirect_to owner_company_addresses_path  and return

だから、新しいアドレスパスにリダイレクトしたいだけです。エラーが発生する理由がわかりません。

前もって感謝します。

- - 編集 - -

1つのパスのみを返す必要があるようです(redirect_toとreturnで十分だと思っていましたが、そうではありません)

def after_sign_in_path_for(resource)

        @final_url = root_path
        if current_user.is? :company_owner
            if $redis.hget(USER_COMPANY_KEY, current_user.id).nil?
                @final_url = new_owner_company_path
            else
                @addr_pending = $redis.hget(PENDING_ADDRESS_KEY,current_user.id)
                unless @addr_pending.nil? || !@addr_pending
                     @final_url = owner_company_addresses_path
                end
            end
        end
        @final_url
  end
4

1 に答える 1

13

redirect_toメソッド呼び出しとreturnステートメントを削除する必要があります。after_sign_in_path_forパスのみを返す必要があります:

例えば:

def after_sign_in_path_for(resource)
  new_owner_company_path
end
于 2012-08-26T20:05:10.623 に答える