Railsでの共通化をメモ。View、Controller、Model
View
- 部分テンプレートとして切り出す(共通パーツ)
- 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
- ApplicationController等親のControllerを継承させる(共通パーツ)
- 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
- 親のModelを継承させる(共通パーツ)
- 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 の存在理由