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

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

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

前の記事
[Ruby on Rails6 実践ガイド cp4~cp6 【メモ】](https://qiita.com/nizi24/items/aca9a745ccda08081eeb)
[Ruby on Rails6 実践ガイド cp7~cp9 【メモ】](https://qiita.com/nizi24/items/60e7fb846a25830478b9)

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

### try

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

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

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

---
### 配列でURLを指定する

```ruby
  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)

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

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

# Chapter 11 Strong Parameters

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

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

---
### Strong Parameters

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

---

### FactroyBotの設定

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

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

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

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

```ruby
user = create(name: "foo")
```

# Chapter 12 アクセス制御

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

```ruby
skip_before_action :authorize
```

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

---
### 共有エグザンプル

#### shared_examples

```ruby
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アクションかが明示されていないので、複数のファイルで共用できます。

<strong>使用例</strong>

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

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

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

```ruby
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する必要があります。

```ruby:spec/rails_helper.rb
#省略
RSpec.configure do |config|
  #省略
  config.include ActiveSupport::Testing::TimeHelpers
end
```

```ruby
travel_to 60.minutes.from_now
```

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

```ruby
travel_back 60.minutes.ago
```

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

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

[Ruby on Rails6 実践ガイド cp13~cp15 【メモ】](https://qiita.com/nizi24/items/241e766e7c2afc98292b)
[Ruby on Rails6 実践ガイド cp16~cp18 【メモ】](https://qiita.com/nizi24/items/e83749826f8d70223311)
[Ruby on Rails6 実践ガイド[機能拡張編] cp3~cp6 【メモ】](https://qiita.com/nizi24/items/36da7b89d561c19af30f)
[Ruby on Rails6 実践ガイド[機能拡張編] cp7~cp9 【メモ】](https://qiita.com/nizi24/items/232e4f05f9d416e0a08c)
[Ruby on Rails6 実践ガイド [機能拡張編] cp10~cp12 【メモ】](https://qiita.com/nizi24/items/2ec4ed513fce22a89222)

## 引用元
※マークダウンの引用を用いている部分は以下の書籍から引用しています。
[Ruby on Rails6 実践ガイド](https://book.impress.co.jp/books/1118101134)