心はいつもAirPucci (空元気でもいいから)

毎日がPucciを着ているような気分

RailsTutorial4.0を高速で復習する。9.2.3章。

   


9.2.3フレンドリーフォワーディング、です。

ログオンしていないユーザーが編集ページにアクセスしようとしていたなら、ユーザーがサインインした後にはその編集ページにリダイレクトされるようにするのが望ましい動作です。

フレンドリーフォワーディングを実現します。

テストを書く

リスト9.17 フレンドリーフォワーディングのテスト。
spec/requests/authentication_pages_spec.rb

require 'spec_helper'

describe "Authentication" do
略
  describe "authorization" do

    describe "for non-signed-in users" do
      let(:user) { FactoryGirl.create(:user) }

      describe "when attempting to visit a protected page" do
        before do
          visit edit_user_path(user)
          fill_in "Email",    with: user.email
          fill_in "Password", with: user.password
          click_button "Sign in"
        end

        describe "after signing in" do

          it "should render the desired protected page" do
            expect(page).to have_title('Edit user')
          end
        end
      end
略
    end
略
  end
end

実装する

リスト9.18 フレンドリーフォワーディングを実装したコード。
app/helpers/sessions_helper.rb

module SessionsHelper
略
  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
end

ヘルパーで定義するのはいいのですが、リダイレクト先を:return_toというキーでsession変数に保存しています。この手にでたか。
request.urlは現在のurlです。

リスト9.19 store_locationメソッドを、サインインしたユーザーのbefore_actionに追加する。
app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :signed_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  .
  .
  .
  def edit
  end
  .
  .
  .
  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end

    # Before actions

    def signed_in_user
      unless signed_in?
        store_location
        redirect_to signin_url, notice: "Please sign in."
      end
    end

    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_path) unless current_user?(@user)
    end
end

リスト9.20 セッションのcreateアクションでフレンドリーフォワーディングを実装する。
app/controllers/sessions_controller.rb

class SessionsController < ApplicationController
  .
  .
  .
  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_back_or user
    else
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end
  .
  .
  .
end

さっさと終わらせたいのでだんだん只のコピペになってきました。コミットして次
9.3すべてのユーザーを表示する
にいきます。

 - テクニカル ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

no image
wordpressはじめます

ブログを立ち上げるのは久しぶりです。 以前から、ブログメディアをやりたいと思って …

no image
Macで.htaccessを表示する設定

MacBook Air2代目。以前は行っていた.(ドット)がついたファイルをMa …

no image
RailsTutorial4.0を高速で復習する。3.5章。最後の問題。

3.5演習、3もんめ、最後の問題です。 3.(上級者向け)「Heroku pag …

RailsTutorial4.0を高速で復習する。11.1.4章。

11.1.4フォローしているユーザー 、です。 followed_usersとf …

no image
RailsTutorial4.0を高速で復習する。7.2章

7.2ユーザー登録フォーム、です。 ユーザー認証も登録も、モデルは作ってあるので …

no image
Vaio Pよりも軽く感じる?MacBookAirとお出かけ

Vaoi Pを手放し、iPadも手放し、UQ Wimaxは解約し、DellのWi …

教育のためならば、iPadアプリ料金なんて青天井ですわ

今年4月、USでのiPad発売。姪の中学入学祝いにちょうどいいなと思っていたら日 …

no image
RailsTutorial4.0を高速で復習する。9.3.2章。

9.3.2サンプルのユーザー、です。 Faker gemで、実際にありそうなユー …

パーフェクトRuby 2章Rubyの基礎 2-1 Hello,Ruby

12章から5章まではPart2 Ruby言語仕様 です。 2章 Rubyの基礎 …

no image
RailsTutorial4.0を高速で復習する。8.2.1章。途中から。

Railsのセキュリティに納得がいかず3日ほど低速です。とりあえず進めています。 …