■導入手順①

[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で問題ないと思います。