Rakeタスクとは?
Rakeとは、Rubyで人気のあるタスクランナーです。 タスクとは何か?
Rakeによってタスクへのアクセスを一元化することができます。
Rakeを使用すると、特定のパターンに一致し、最近変更されたファイルを探すことなどが容易になります。
cronとは?
多くのUNIX系OSで標準的に利用される常駐プログラムの一種で、利用者の設定したスケジュールに従って指定されたプログラムを定期的に起動してくれるものです。 このcronに対して命令を行うには、crontabを使います。
enumとは?
enumは列挙型と訳されます。
列挙とは整数が割り当てられた文字を順番に出力していくことを意味します。
enumを使えば、文字の配列に整数を順番に割り当てられます。
なので、他のプログラマーに読みやすいコードを書くことができます。(可読性が上がる)
たとえば、プログラム内にて都道府県に関する情報を扱う場合、01:北海道、02:青森〜47:沖縄という2桁のコードで表現するよりも、Hokkaido:北海道、Aomori:青森〜Okinawa:沖縄と意味のある単語で表す方がプログラムの可読性が上がります。
また、整数値の範囲が決定されるので誤った数値を使ってしまうことを前もって、防げます。
Railsでは、モデルにenumを定義することで、文字を使ってカラムの値を変更したり、反対に取り出したりできます。
繰り返しになりますが、意味のある単語を使って、操作できるのでプログラマーが開発をしやすくなります。
wheneverとは?
cronをrubyの記法で簡単に扱えるようにしたgemライブラリです。
■導入手順①
[Rakeタスクの作成]
コマンドでlib/tasks配下にrakeファイルを作成します。
$ rails g task article_state
また、事前に公開日時が現在時刻から見て過去の記事を取得する為のscopeも作成しておきます。
app/models/article.rb
enum state: { draft: 0, published: 1, publish_wait: 2 } #=> statusに公開待ち(publish_wait)も追加する。
scope :past_published, -> { where('published_at <= ?', Time.current) } #=>事前に公開日時が現在時刻から見て過去の記事を取得する為のscopeも作成しておきます。
└?はプレースホルダと呼ばれ、第二引数で指定した値が置き換えられます。
つまり、Time.currentで取得された現在の時間が?と置き換えれて、published_atの値と<で比較して検索します。
[Rakeタスクの実行]
bundle exec rake --tasks
rake article_state:change_to_be_published # 公開待ちの中で、公開日時が過去になっているものがあれば、ステータスを「公開」に変更されるようにする
[実行コマンド]
$ bundle exec rake article_state:change_to_be_published
[Wheneverの導入]
Gemfile
gem 'whenever', require: false
$ bundle install
$ bundle exec wheneverize ****. **** # configディレクトリ配下にあるschedule.rbファイルを作成
config/scheule.rb
# Rails.rootを使用
require File.expand_path(File.dirname(__FILE__) + '/environment')
# cronを実行する環境変数(RAILS_ENVが指定されていないときはdevelopmentを使用)
rails_env = ENV['RAILS_ENV'] || :development
# cronの実行環境を指定(上記で作成した変数を指定)
set :environment, rails_env
# cronのログファイルの出力先指定
set :output, "#{Rails.root}/log/cron.log"
# パスを通すコマンド
job_type :rake, "source /Users/mr.d/.zshrc; export PATH=\"$HOME/.rbenv/bin:$PATH\"; eval \"$(rbenv init -)\"; cd :path && RAILS_ENV=:environment bundle exec rake :task :output"
# 一時間毎に実行する&タスク名の指定
every :hour do
rake 'article_state:change_to_be_published'
end
[crontabを実行**]**
crontabを使ってcronに対して命令をします。
$ bundle exec whenever --update-crontab # wheneverの設定更新
$ bundle exec whenever # 設定内容にエラーが無いか確認
$ crontab -l # 設定されているcronを確認
$ bundle exec whenever --clear-crontab # crontabの設定を削除
===============================================================================================================================
■導入手順②
fat controllerを解消する。
fat controllerとは?
→コントローラー自体の行数が多く、処理の流れを追いにくくなってしまっているControllerの状態を指します
(簡単に言えば見通しが悪い)。
膨大に膨れ上がったControllerのロジックを全てModelへ移してしまうくらいの気持ちでいきましょう。
Controllerに記述するpublicメソッドはアクションだけで十分です。
そしてロジックを移す先は基本的にModelで問題ないと思います。