Ruby
Rails
Concern

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

More than 3 years have passed since last update.

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 の存在理由