心はいつも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
RailsTutorial4.0を高速で復習する。6.2.3章。

6.2.3長さを検証する、です。空データを拒否した次は、入力できるデータ長の制限 …

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

さてRailsTutorial4.0も5章に入ります。まだ序の口です。5章ではb …

使ったらダメなiPhoneケーブル

iPhoneのApple純正ケーブルって、はげやすくないですか?iPhone5用 …

no image
電子雑誌を買いました

GWの計画を立てているとき、行きたい場所を検索をすると、HANAKO WESTの …

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

6.2.4フォーマットを検証する です。 メールアドレスは文字数制限だけじゃだめ …

40秒も待てない。

自由が丘のカフェでこれ書きました。Table Modern Service、食べ …

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

9.3すべてのユーザーを表示する、です。 いろいろ細かい実装するまえにこれやるべ …

no image
Rails 3.2と4.0、複数バージョンをインストールする

Rubyを複数バージョン入れて切り替えて使える事を確認しました。次はRailsを …

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

9.2認可、です。 自分以外の人が自分のProfileを変更できないようにします …

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

リスト5.35 ボタンをユーザー登録ページにリンクする、です。 リンクを貼る系は …