0

したがって、私ClientsController.rbの場合、次のことを行う before フィルターがあります。

現在の年月をチェックします。月が 6 月より後の場合は、変数vote_yearを来年に設定します。そうでない場合は、vote_year今年に設定します。

次に、7 月 1 日の厳しい月と日とともに、その年に基づいて日付属性を設定しています。

基本的に、この特定の日付は毎年 7 月 1 日です。このフィルターが実行された時間が 7 月 1 日より前か後かに基づいて、次の日付を設定する前にフィルターが必要です。

私が持っているコードは次のとおりです。

before_filter :set_next_vote_date, :only => [:create, :new, :edit, :update]

private

def set_next_vote_date
    client = current_user.clients.find(params[:id])
    today = DateTime.parse(Time.now.to_s)
    year = today.year

    if today.month == 7 && today.day == 1
        vote_year = today.year
    elsif today.month > 6
        vote_year = year + 1
    else
        vote_year = year
    end

    client.next_vote = "#{vote_year}-07-01"         
end

問題は、これらのコントローラーでこれらのアクションを実行するたびに、エラーがスローされないことです。ただし、next_voteクライアント レコードの属性は更新されていません。

私は何が欠けていますか?

編集1:

update_attribute( なしで)使用した後!、エラーは発生しませんが、ログでこの特定の属性が更新されていません。

Started PUT "/clients/1" for 127.0.0.1 at 2012-09-08 20:09:17 -0500
Processing by ClientsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"J172LuZQc5N=", "client"=>{"name"=>"John F Kennedy", "email"=>"jfk@email.com", "phone"=>"8234698765", "firm_id"=>"1", "topic_ids"=>"2"}, "commit"=>"Update Client", "id"=>"1"}
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Client Load (0.1ms)  SELECT "clients".* FROM "clients" WHERE "clients"."user_id" = 1 AND "clients"."id" = ? LIMIT 1  [["id", "1"]]
   (0.1ms)  begin transaction
   (0.0ms)  commit transaction
  CACHE (0.0ms)  SELECT "clients".* FROM "clients" WHERE "clients"."user_id" = 1 AND "clients"."id" = ? LIMIT 1  [["id", "1"]]
   (0.1ms)  begin transaction
  Topic Load (0.6ms)  SELECT "topics".* FROM "topics" WHERE "topics"."id" = ? LIMIT 1  [["id", 2]]
  Topic Load (0.2ms)  SELECT "topics".* FROM "topics" INNER JOIN "clients_topics" ON "topics"."id" = "clients_topics"."topic_id" WHERE "clients_topics"."client_id" = 1
   (0.4ms)  UPDATE "clients" SET "phone" = 823498765, "updated_at" = '2012-09-09 01:09:17.631839' WHERE "clients"."id" = 1
   (1.4ms)  commit transaction
Redirected to http://localhost:3000/clients/1

next_vote属性は更新されないことに注意してください。edit確かに、フォームのパーシャルにはその属性を含めませんでしたが、これbefore_filterが実行されている場合、レコードが更新されると想定しました。しかし、それがまったく実行されているかどうかさえわかりません。

編集2:

気にしないでください、それは今働いているようです。上記のログの貼り付けは、編集アクションの後であり、編集アクションの前に before_filter が実行されます-DUH! 愚かな私:)

4

2 に答える 2

1

属性を変更した後、クライアントを保存していないようです。

そのコードを少しクリーンアップする方法に関するいくつかの追加の提案:

before_filter :set_next_vote_date, :only => [:create, :new, :edit, :update]

private

def set_next_vote_date
  client    = current_user.clients.find(params[:id])
  today     = Date.today
  vote_year = today.month > 6 ? today.year + 1 : today.year

  client.update_attribute(:next_vote, Date.new(vote_year, 7, 1))
end
于 2012-09-09T00:46:57.763 に答える
1

試す:

def set_next_vote_date
  client = Client.find(params[:id])
  today = Time.now
  year = today.year

  if today.month == 7 && today.day == 1
    vote_year = year
  elsif today.month > 6
    vote_year = year + 1
  else
    vote_year = year
  end

  client.update_attribute!(:next_vote, "#{vote_year}-07-01")
end

update_attribute! (強打に注意してください)何か問題が発生した場合に例外が発生します..少なくとも、こじ開けて救助し、何が起こっているかを確認できます。save の呼び出しは、後で activerecord コールバック サイクルで永続化されるため、必要ありません。

于 2012-09-09T00:48:01.183 に答える