1

2つのモデルUserPushupReminder、があり、PushupReminderコントローラーにメソッドcreate_a_reminder(配置するのに最適な場所ですか?)があり、ユーザーIDを渡すときに特定のユーザーのPushupReminderの新しいインスタンスを作成します。私は自分のテーブルでuser_id列を介した関連付けがPushupReminder正しく機能しており、Railsコンソールを介してリマインダーを作成することとリマインダーメールを正しく送信することの両方ができることをテストしました。

モデルコードのスニペットは次のとおりです。

class User < ActiveRecord::Base
    has_many :pushup_reminders
end

class PushupReminder < ActiveRecord::Base
    belongs_to :user
end

そして、create_a_reminderメソッド:

def create_a_reminder(user)
    @user = User.find(user)

    @reminder = PushupReminder.create(:user_id => @user.id, :completed => false, :num_pushups => @user.pushups_per_reminder, :when_sent => Time.now)

    PushupReminderMailer.reminder_email(@user).deliver
end

特定のユーザーのコードでそのメソッドを実行する方法がわかりcreate_a_reminderません(最終的には、すべてのユーザーのcronジョブになります)。誰かが私の考えを正しい方向に導くのを手伝ってくれるなら、私は本当に感謝しています。

ありがとう!

4

2 に答える 2

3

編集私はここにサンプルのRailsアプリを投稿し、私の答えで話していることを示しています。また、ネストされていない方法で利用できる場合にプッシュアップリマインダーを処理する方法を示すコメントを含む、新しいコミットを投稿しました。

確かに、ポールは正しい方向に進んでいます。これは2つの場所で機能を作成する必要があります。これをcronジョブとして実行する場合は、2番目が重要です。

  1. で、;PushupRemindersControllerのネストされたリソースとして。UserWeb経由で腕立て伏せのリマインダーを作成するため。
  2. 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/tasksPushupReminder

cronタスクの設定に非常に役立つと思ったgemの1つは、 everythinggemです。サイト固有のcronジョブをRubyで記述し、cronタブに貼り付ける必要があるものの正確な出力を取得します(Capistranoを介してデプロイする場合は、cronジョブの完全なハンズオフ管理)。

于 2012-11-24T04:19:55.313 に答える
1

attr_accessibleを:user_idではなく:userに設定してみてください。

attr_accessible :user

ただし、これを行うためのさらに良い方法は、

@user.pushup_reminders.create

このようにして、user_idが自動的に割り当てられます。

次のようなネストされたルートを使用します。

:resources :users do
  :resources :pushup_reminders
end

これにより、params [:user_id]とparams [:id]が提供されるため、データベースでオブジェクトを見つけることができます。

セッションを介してユーザーを知っている場合は、ルートをネストする必要はなく、代わりにそれを使用して保存することができます。

安らかなルートを使用する場合は、pushup_remindersコントローラーでcreateアクションを使用することをお勧めします。これは、この種のオブジェクトを作成するための最も一般的で安らかな方法です。

def create
  @user = User.find(params[:user_id]
  @reminder  = @user.pushup_reminders.create()
end

オブジェクトの作成が成功したかどうかを確認する必要がある場合は.new.save

于 2012-11-24T00:16:39.230 に答える