349
321

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

349
321
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
349
321

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?