web-dev-qa-db-ja.com

Rails 4認証済みルートルートが機能しない

私がやろうとしていること

ユーザーがログインしていない場合は、registrations#newページにユーザーを送りたいです。

ログイン情報を入力して[送信]をクリックすると、registrations#showページに移動します。

何が起こっている

ログインしていない場合は、registrations#newページに移動します(これまでのところ正しい)。ただし、ログインフォームを送信すると、リダイレクトループでエラーが送信されます。サーバーの出力は、このブロックが何度も繰り返されるだけです。

Started GET "/" for 127.0.0.1 at 2013-09-25 02:31:59 -0400
Processing by RegistrationsController#new as HTML
  User Load (0.7ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 8 ORDER BY "users"."id" ASC LIMIT 1
Redirected to http://lvh.me:3000/
Filter chain halted as :require_no_authentication rendered or redirected
Completed 302 Found in 2ms (ActiveRecord: 0.7ms)

私はそれを理解できないようです。別のページに手動で移動するとログインできますが、authenticatedルートパスが正しく機能していません。ルートファイルでいくつかの異なる組み合わせを試しましたが、取得できないようです。私が使用しているコードは このスレッド に基づいています

私のコード

私のアプリケーションコントローラーにはbefore_filter :authenticate_user!

私のルートファイル:

devise_for :users, :controllers => {
  :registrations => "registrations"
}

devise_scope :user do
  root to: "registrations#new"
end

authenticated :user do
  root to: "registrations#show", :as => "profile"
end

unauthenticated do
  root to: "registrations#new", :as => "unauthenticated"
end
19
Tom Prats

まず、_Devise::RegistrationsController_をカスタマイズする必要があります(ファイル_app/controllers/registrations_controller.rb_を追加できます)

そして、デバイスの prepend_before_filter を参照してください_registrations_controller.rb_

_prepend_before_filter :require_no_authentication, :only => [ :new, :create, :cancel ]
prepend_before_filter :authenticate_scope!, :only => [:edit, :update, :destroy]
_

showアクションを_prepend_before_filter :authenticate_scope!_に追加します

registrations_controller.rb

_class RegistrationsController < Devise::RegistrationsController
  prepend_before_filter :require_no_authentication, :only => [ :new, :create, :cancel ]
  prepend_before_filter :authenticate_scope!, :only => [:edit, :update, :destroy, :show]

  # GET /resource/sign_up
  def new
    super
  end

  # POST /resource
  def create
    super
  end

  # GET /resource/edit
  def edit
    super
  end

  def update
    super
  end

  # DELETE /resource
  def destroy
    super
  end

  def show
  end


  protected

  def after_sign_up_path_for(resource)
    after_sign_in_path_for(resource)
  end

end
_

また、 デバイス登録 (編集および新しいテンプレート)のビューを_/app/views/registrations/_にコピーすると、プロファイルページの_show.html.erb_フォルダーにファイル_/app/views/registrations/_を作成できます。

工夫のルートは次のようになります:

_devise_for :users, :skip => [:registrations]

devise_for :users, :controllers => {
  :registrations => "registrations"
}

authenticated :user do
  devise_scope :user do
    root to: "registrations#show", :as => "profile"
  end
end

unauthenticated do
  devise_scope :user do
    root to: "registrations#new", :as => "unauthenticated"
  end
end
_

最後に、ファイルapplication_controller.rbafter_sign_in_path_for(resource)およびafter_sign_out_path_for(resource_or_scope)に「パス」を設定します。

_class ApplicationController < ActionController::Base
  protect_from_forgery

  private

   def after_sign_in_path_for(resource)
     # After you enter login info and click submit, I want you to be sent to the registrations#show page
     profile_path
   end
   def after_sign_out_path_for(resource_or_scope)
     new_user_session_path
   end
end
_

注:(サンプルアプリを作成するために)これを試しましたが、機能します。サインイン時のログを参照 ここ 、およびログアウト時のログ ここ

24
rails_id

registration#newへのリダイレクトはデフォルトであるため、(ルートファイルで)これを行うだけです。

devise_for :users, :controllers => {
  :registrations => "registrations"
}

devise_scope :user do
  root to: "registrations#show" # This is the root path of the user when you are logged in
end

unauthenticated do
  root to: "registrations#new", :as => "unauthenticated"
end

# I dont't think this part is neccesary... Try if it works without
authenticated :user do
  root to: "registrations#show", :as => "profile"
end
8
jokklan

コントローラに属するジョブを実行するためにルートを使用しないでください。

サインアップ後にユーザーを特定のページにリダイレクトするには、Deviseの組み込みafter_sign_up_path_forを使用してオーバーライドします。

class ApplicationController
  def after_sign_up_path_for(resource)
    faked_user_profile_path(resource)
  end
end

ルートについては、devise_forの部分を除いてすべてをよく知っているわけではありません。ただし、リダイレクト機能の場合は、このオーバーライドで十分です。

2
Billy Chan