0

私は Michael Hartl による Ruby on Rails チュートリアルに取り組み、アプリケーションのナビゲーション バーに含まれる小さなログイン フォームも実装しました (ユーザーは実際のログイン ページまたはナビゲーション バーのログインからログインできます)。ユーザーがログイン ページからログインする場合、root_url にリダイレクトする必要があります。

ただし、ユーザーが navbar フォームからログインした場合は、「ログインに成功しました!」というメッセージが表示された同じページに留まりたいと考えています。ページ上部のメッセージ。これどうやってするの?

私のコードは次のとおりです。

_header.html.erbファイルから:

<%= form_tag sessions_path, class: "navbar-form pull-right" do %>
  <%= text_field_tag :email, nil, class: "input-small", placeholder: "Email" %>
  <%= password_field_tag :password, nil, class: "input-small", placeholder: "Password" %>
  <%= check_box_tag :remember_me, 1, params[:remember_me], title: "select to remember login" %>
  <%= submit_tag "Sign in", class: "btn btn-mini" %>
<% end %>

sessions_helper.rbファイルから:

def redirect_back_or(default)
  redirect_to(session[:return_to] || default)
  session.delete(:return_to)
end

def store_location
  session[:return_to] = request.url
end

redirect_back_orのメソッドを活用しようとしましたsessions_helper.rbが、ログイン リクエストの元のページではなく、セッション パスを session[:return_to] 値としてキャプチャしているようです。あなたのアイデアをいただければ幸いです。

4

1 に答える 1

0

私はついにこれを理解することができました...

sessions_helper.rbファイル (既に に含まれています)ApplicationControllerに、次のコードを追加します。

def store_location_login
  session[:referral_url] = request.referer
end

def redirect_back_login_or(default)
  if URI(signin_path).path == URI(session[:referral_url]).path
  redirect_to root_url
else
  redirect_to(session[:referral_url] || default)
end

session.delete(:referral_url)

次に、SessionsController作成アクションを次のように変更しました。

def create
  user = User.find_by_email(params[:email].downcase)
  store_location_login

  if user && user.authenticate(params[:password])
    if params[:remember_me]
      sign_in user
    else
      sign_in_temp user
    end

    flash[:success] = "Successfully logged in!"
    redirect_back_login_or root_url

  else
    flash.now[:error] = 'Invalid email/password combination'
    render 'new'

  end
end

これらの変更により、望ましい動作が得られます。

  • メインログインページからログインし、ログインに成功すると、ユーザーを root_url にリダイレクトします
  • サイト ナビゲーション バーのログイン フォームからログインすると、元のページにリダイレクトされます (元のページがメインのログイン フォームでない場合)。
  • これは、それぞれに同じセッション コントローラーの create メソッドを使用します。

これはいくらかリファクタリングできると思いますが、うまくいきます。

于 2012-12-14T07:44:59.537 に答える