Rails 共通部分を切り出す (View, Controller, Model) メモ

  • 89
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Railsでの共通化をメモ。View、Controller、Model

View

  1. 部分テンプレートとして切り出す(共通パーツ)
  2. helperとして切り出す(メソッド)

1. 部分テンプレートとして切り出す(共通パーツ)

こちらに以前まとめました。
Rails 部分テンプレートの使い方

2. helperとして切り出す(メソッド)

viewのモジュール作成。helpersの中に

viewの中にロジックを書くと見通しが悪くなるのでhelperの中にロジックは記述する。
また、繰り返し表示するものをまとめておくとviewをすっきりさせることが出来る。

app/helpers/application_helper.rb
module ApplicationHelper
  def create_time(created_at)
    created_at.strftime('%m/%d %H:%M')
  end
end
app/view/some.html.erb
...
  <%= create_time created_at %>
...

参考: 【Rails】Helperを使ってよりDRYなviewを書こう

Controller

  1. ApplicationController等親のControllerを継承させる(共通パーツ)
  2. concernsの中にまとめる(メソッド)

1. ApplicationController等親のControllerを継承させる(共通パーツ)

app/controllres/top_controller.rb
class TopController < ApplicationController
...
end

2. concernsの中にまとめる(メソッド)

app/controllers/concerns/common.rb
module Common
  extend ActiveSupport::Concern

  included do
    # ここにcallback等
  end

  # メソッド
  def categories
    ArticleCategory.order(:id).all
  end

  private

  # privateメソッド

end
app/controllers/articles_controller.rb
class ArticlesController < ApplicationController
  include Common

  def index
    @categories = categories
  end

end

ActiveSupport::Concernとは何ぞや

[Rails] ActiveSupport::Concern の存在理由

Module間の依存関係を分かりやすくしてくれます。上記リンク先で十分わかりやすかったです。

Model

  1. 親のModelを継承させる(共通パーツ)
  2. concernsの中にまとめる(メソッド)

1. 親のModelを継承させる(共通パーツ)

Controllerと同様に他のModelを継承させる

2. concernsの中にまとめる(メソッド)

app/models/concerns/common_module.rb
module CommonModule
  extend ActiveSupport::Concern

  # callback、scope
  included do
    before_initialize :set_default_time
    scope :publised, -> { where(state: "published") }
  end

  def set_default_time
    self.published_start_time = Time.zone.now
  end

  # インスタンスメソッド
  def anonymous?
    user_state == "anonymous"
  end

  # クラスメソッド  
  module ClassMethods
    def say_today
      puts Time.zone.now
    end
  end

end
app/models/article.rb
class Article < ActiveRecord::Base
  include CommonModule

  # 適当です。enum使えばいいんですが。 
  def author_name
    author_name if anonymous?
  end
end

参考

【Rails】Helperを使ってよりDRYなviewを書こう
ActiveSupport::Concernの使い方とテスト(RSpec)
[Rails] ActiveSupport::Concern の存在理由

  • この記事は以下の記事からリンクされています
  • Rails メモからリンク