0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ruby on Rails6 実践ガイド cp10~cp12 【メモ】

Last updated at Posted at 2020-06-09

はじめに

この記事の筆者はプログラミングを学習し始めたばかりの初心者です。間違いがあれば指摘していただけると幸いです。

概要

この記事はRuby on Rails6 実践ガイドを読んで学んだことを自分用のメモとして記録したものです。抜粋してピックアップするので読みづらいと思われます。すいません。
この本には、続編の機能拡張編もあり、記事を書いている段階で二冊とも学習を終えています。復習もかねて記事を書いていくつもりです。
18のチャプターに分かれているので、見出しごとに区切っていきます。

前の記事
Ruby on Rails6 実践ガイド cp4~cp6 【メモ】
Ruby on Rails6 実践ガイド cp7~cp9 【メモ】

Chapter 10 レコードの表示、新規作成、更新、削除

try

このメソッドはレシーバーがnilであればnilを返し、nilでなければ第一引数に指定した名前のメソッドを実行します。第二引数以降はメソッドの引数になります。

user.try(:name=, "foo")

上の例だとuserがnilでないなら、userをレシーバーとしてname=が実行されます。


配列でURLを指定する

  def show
    staff_member = StaffMember.new(params[:id])
    redirect_to [ :edit, :admin, staff_member ]
  end

上記のように配列でURLを指定することができます。配列の要素からルーティング名が推定され、URLパスが生成されます。上の例だとRailsがルーティング名は edit_admin_staff_member であると推定し、/admin/staff_member/:id/edit というURLが導き出されます。


after(css)

label.require:after {
  content: "*";
  padding-left: 6px;
  color: $red;
}

:after をcssセレクタの後につけると、要素の後ろにcontentに指定した要素が追加されます。上の例だと require クラスのlebel要素の後ろにアスタリスクがつくようになります。

Chapter 11 Strong Parameters

マスアサインメント脆弱性

プログラミングの初歩的な知識があれば、自由に書き換えられるべきではない属性を書き換えることができてしまいます。この脆弱性をマスアサインメント脆弱性といいます。Strong Parametersはこの脆弱性に対してRails4.0で導入された対抗策です。


Strong Parameters

params.require(:login_form).permit(:email, :password)

paramsはparamsオブジェクトを返すメソッドです。requireメソッドを呼び出すと、paramsオブジェクトが:login_formというキーをもっているかどうかを調べます。もし持っていなければ例外ActionController::ParameterMissingが発生します。
requireメソッドの戻り値にpermitメソッドを呼び出すと、引数に指定されていないパラメーターが除去されます。


FactroyBotの設定

spec/rails_helper.rb
#省略
RSpec.configure do |config|
  #省略
  config.include FactroyBot::Syntax::Methods
end

上記の設定がない時、FactroyBotを呼び出そうとすると、

user = FactroyBot.create(name: "foo")

のように呼び出す必要がありますが、
設定を追加することにより、下のようにFactroyBotを省略して書くことができます。

user = create(name: "foo")

Chapter 12 アクセス制御

skip_before_action

クラスメソッドskip_before_actionは、引数に指定したメソッドがアクションの前に実行されないようにします。

skip_before_action :authorize

親クラスで指定されたbefore_actionをスキップしたい時などに使えます。


共有エグザンプル

shared_examples

shared_examples "a protected admin controller" do |controller|
  let(:args) do
    {
      host: Rails.application.config.baukis2[:admin][:host],
      controller: controller
    }
  end

  describe "#index" do
    example "ログインフォームにリダイレクト" do
       get url_for(args.merge(action: :index))
       expect(response).to redirect_to admin_login_url
    end
  end
end

shared_examples メソッドを用いると、複数のspecファイルで同じexampleを使いまわすことができます。上記の例ではどのコントローラのindexアクションかが明示されていないので、複数のファイルで共用できます。

使用例

describe "管理者による職員管理", "ログイン前" do
  include_examples "a protected admin controller", "admin/staff_member"
end

include_examplesは第一引数にshared_examplesの名前を指定します。第二引数以降はブロック引数として取り込まれます。上の例では、controllerを指定しています。

describeの第二引数

上の例ではdescribeに2つ目の引数が指定されています。これはcontext(文脈)を表します。
下のように書き換えられます。

describe "管理者による職員管理" do
  context "ログイン前" do
    include_examples "a protected admin controller", "admin/staff_member"
  end
end

travel_to

ActiveSupport::Testing::TimeHelpersのtravel_toメソッドは現在時刻を指定した時点に移動させます。

RSpecにActiveSupport::Testing::TimeHelpersを組み込むにはrails_helperでincludeする必要があります。

spec/rails_helper.rb
#省略
RSpec.configure do |config|
  #省略
  config.include ActiveSupport::Testing::TimeHelpers
end
travel_to 60.minutes.from_now

上の例では、現在時刻を60分進めています。

travel_back 60.minutes.ago

travel_backを用いて現在時刻を60分戻すこともできます。

続き

続きの記事のURLも順次追加していきます。

Ruby on Rails6 実践ガイド cp13~cp15 【メモ】
Ruby on Rails6 実践ガイド cp16~cp18 【メモ】
Ruby on Rails6 実践ガイド[機能拡張編] cp3~cp6 【メモ】
Ruby on Rails6 実践ガイド[機能拡張編] cp7~cp9 【メモ】
Ruby on Rails6 実践ガイド [機能拡張編] cp10~cp12 【メモ】

引用元

※マークダウンの引用を用いている部分は以下の書籍から引用しています。
Ruby on Rails6 実践ガイド

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?