編集:私はここにサンプルのRailsアプリを投稿し、私の答えで話していることを示しています。また、ネストされていない方法でも利用できる場合にプッシュアップリマインダーを処理する方法を示すコメントを含む、新しいコミットを投稿しました。
確かに、ポールは正しい方向に進んでいます。これは2つの場所で機能を作成する必要があります。これをcronジョブとして実行する場合は、2番目が重要です。
- で、;
PushupRemindersController
のネストされたリソースとして。User
Web経由で腕立て伏せのリマインダーを作成するため。
- cronジョブとして実行されるrakeタスク。
必要なコードのほとんどはRailsによってすでに提供されており、そのほとんどはActiveRecordアソシエーションにすでに設定されています。#1の場合、で、ネストされたルートroutes.rb
を設定します...
# Creates routes like...
# /users/<user_id>/pushup_reminders
# /users/<user_id>/pushup_reminders/new
# /users/<user_id>/pushup_reminders/<id>
resources :users do
resources :pushup_reminders
end
そして、あなたPushupRemindersController
は次のように見えるはずです...
class PushupRemindersController < ApplicationController
before_filter :get_user
# Most of this you'll already have.
def index
@pushup_reminders = @user.pushup_reminders
respond_with @pushup_reminders
end
# This is the important one.
def create
attrs = {
:completed => false,
:num_pushups => @user.pushups_per_reminder,
:when_sent => Time.now
}
@pushup_reminder = @user.pushup_reminders.create(attrs)
respond_with @pushup_reminder
end
# This will handle getting the user from the params, thanks to the `before_filter`.
def get_user
@user = User.find(params[:user_id])
end
end
もちろん、new
ユーザーなどにWebフォームを表示するアクションもあります。
2番目のユースケースであるタスクの場合、プロジェクトのディレクトリにRakeタスクとしてcron
設定します。これにより、cronタスクを介して、必要なときにいつでもヒットするアクションを自由に設定できます。コントローラーアクションと同じように、すべてのRailsモデルなどに完全にアクセスできます。本当の秘訣はこれです。リマインダーを設定するためのクレイジーなカスタムロジックがある場合は、それをモデルのアクションに移動します。そうすれば、rakeタスクから作成メソッドを起動でき、コントローラーから作成メソッドを起動できます。作成ロジックを繰り返し作成する必要はありません。繰り返しないでください(DRY)!lib/tasks
PushupReminder
cron
タスクの設定に非常に役立つと思ったgemの1つは、 everythinggemです。サイト固有のcronジョブをRubyで記述し、cronタブに貼り付ける必要があるものの正確な出力を取得します(Capistranoを介してデプロイする場合は、cronジョブの完全なハンズオフ管理)。