Rails 総復習1ヶ月チャレンジ 11日目(RUNTEQカリキュラム復習編)

はい!チャレンジ11日目です!
今日から私が通っていたプログラミングスクールRUNTEQのカリキュラム復習に入りたいと思います。
RUNTEQについてはこちら↓
RUNTEQ(ランテック)Web系特化オンラインプログラミングスクール

復習なので内容として覚えていなかったところ・あやふやだったところの備忘録になると思います。

Model.model_name.human、Model.human_attribute_name(attribute)

gemのi18nの国際化対応の中で出てくる記述です。最初に見た時、「は?」ってなりましたが、今回見ても、「ん〜見たことあるけど、は?」ってなりましたので復習します。

Model.model_name.humanメソッドとModel.human_attribute_name(attribute)メソッドを使うことで、モデル名と属性名を透過的に参照できるようになります。Rails 国際化 (i18n) API - Railsガイドより

なるほど、ja.ymlファイルにどういう風に記載されているか細かく気にせずとも使えるようになるってことですかね(もしかしたらちょっと違うかも)。
使い方はこんな感じです。

#config/locales/ja.yml

ja:
  activerecord:
    # モデル名
    models:
      user: 顧客
    # モデルごとのアトリビュート名
    attributes:
      user:
        name: 名前
        address: 住所
  # 全モデル共通のアトリビュート名
  attributes:
    created_at: 作成日時
    updated_at: 更新日時
> User.model_name.human
=> "顧客"
> User.human_attribute_name(:name)
=> "名前"
> User.human_attribute_name(:created_at)
=> "作成日時"

あなたはいくつ知っている?Rails I18nの便利機能大全! - Qiitaより引用

これは使いながら慣れるしかなさそうですね・・・

decoratorのobjectメソッドについて

gem draperを使用し、decoratorを導入している前提です。 objectというメソッドが気になりました。使い方的にはselfでインスタンスを参照しているような使い方です。

Accessing the model When writing decorator methods you'll usually need to access the wrapped model. While you may choose to use delegation (covered below) for convenience, you can always use the object (or its alias model): GitHub - drapergem/draper: Decorators/View-Models for Rails Applicationsより

どうやらselfと同様に使えるみたいですが、Draper::Decorator クラス以外では使えないようです。Draper特有のメソッドということですね。 なおdelegate_allが記載されているとobjectなしで使えるみたいです。

Method: Draper::Decorator.delegate_all — Documentation for drapergem/draper (master)

使い方例

#user_decorator.rb

class UserDecorator < Draper::Decorator
  delegate_all

  def full_name
    "#{last_name} #{first_name}"
  end
end

delegate_allがあるのでこの場合はメソッド内でobjectを付ける必要はありません。

アクセス制御をさせたいコントローラーに個別にbefore_actionを記載しない

これは考え方のところです。指定のURLにログインなしでアクセスしようとするとログインを要求されるようにします。
自分はログインが必要になるところだけbefore_action書けばいいかと思ったんですけど、そうすると他controllerを実装する度にbefore_actionを記載しなければなりません。それよりも継承元の親クラスであるApplicationControllerに記載することで処理を共通化させ、ログイン処理が必要でないメソッドだけskip_before_actionをした方が効率化良いというものです。 例えばログイン画面ではアクセス制御を適用させたくないのでUserSessionsContollerにはskip_before_actionで継承元のbefore_actionで定義した処理が必要です。

#app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  add_flash_types :success, :info, :warning, :danger
  before_action :require_login

  :
end
class UserSessionsController < ApplicationController
  skip_before_action :require_login, only: %i[new create]
:
end

今回は以上です!