1

ログインしていないユーザーがこのページの [Deja Tu Opinion] ボタンをクリックすると:

https://github.com/Yorkshireman/pamplona_english_teacher2/blob/create_testimonials/app/views/static_pages/home.html.erb

...ユーザーはログインページにリダイレクトされ、「続行する前にログインまたはサインアップする必要があります」というメッセージが表示されます。私はこれを行いました - ここでは問題ありません。

「Deja Tu Opinion」ボタンは、new_testimonial_path に移動します。ただし、ログインしていない場合は、ログイン ページにリダイレクトされます。「require_login」メソッドを記述し、アプリケーション コントローラーを配置することでこれを実現しました。

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception


  private
  def require_login
    if !logged_in?
      redirect_to('/user_sessions/new')
      flash[:notice] = "Necesitas entrar o salir antes de continuar"
    end
  end

end

次に、証言コントローラーで宣言しました。

class TestimonialsController < ApplicationController

  before_action :set_testimonial, only: [:show, :edit, :update, :destroy]
  # before_action :correct_user, only: [:edit, :update, :destroy]
  before_action :require_login, except: [:index, :show]

ログインすると、root_path にリダイレクトされます。

class UserSessionsController < ApplicationController

  # skip_before_filter :require_login, except: [:destroy]

  def new
    @user = User.new
  end

  def create
    if @user = login(params[:email], params[:password])
      redirect_to root_url, notice: 'Login successful!'
    else
      flash.now[:alert] = 'Login failed'
      render action: 'new'
    end
  end

  def destroy
    logout
    redirect_to(root_url, notice: 'Logged out!')
  end
end

ただし...私が望んでいるのは、この状況では、root_pathに戻るだけでなく、new_testimonial_pathに誘導されることです。

つまり、要約すると、ログインしていないユーザーが「自分の意見を書く」ボタン (「自分の証言を書く」という意味) をクリックすると、ログインしていないため、new_user_session_path に誘導されます。次にログインすると、root_path に戻ります。そこで、ページをもう一度下にスクロールして、[Deja tu Opinion] ボタンをクリックする必要があります。これにより、new_testimonial_path に移動します。

ログインしていないユーザーが「意見を聞く」ボタンをクリックすると、ログインしていないため、new_user_session_path に誘導されます。次にログインすると、new_testimonial_path に誘導されます (最初にそれを望んでいたためです)。

私は Sorcery gem を使用しました。「redirect_back_or_to」と呼ばれるこれを実現する方法があると確信していますが、ドキュメントからその使用方法を理解することはできません。

アプリのコード全体 (create_testimonials ブランチ): https://github.com/Yorkshireman/pamplona_english_teacher2/tree/create_testimonials

ソーサリーのドキュメント: https://github.com/NoamB/sorcery

あなたが助けてくれることを願っています!

4

1 に答える 1

4

解決済み:

Sorcery には require_login という独自のメソッドがあるため、require_login メソッドが redirect_back_or_to メソッドの正常な機能を妨げているようです。したがって、require_login メソッドを単純に削除しました。

redirect_back_or_to メソッドが before_filter (または「before_action」 - 同じこと) でトリガーされると、Sorcery はそのネイティブ メソッドの別の 1 つ、not_authenticated を呼び出します。そのデフォルトのアクションは、root_path に誘導することのようです。これは、アプリケーション コントローラーでオーバーライドできます (プライベート セクションに「not_authenticated」というメソッドを記述し、何をすべきかを指示します (私の場合は、「redirect_to new_user_session」)。

これらの変更により、望ましい結果が得られました。

ここにいくつかの素晴らしい情報があります: http://railscasts.com/episodes/283-authentication-with-sorcery?view=asciicast

于 2015-02-19T02:37:53.220 に答える