1

チェックボックスに基づいてtrueまたはfalseでデータベースのブールフィールドを更新しようとしているのに、問題があります。

Rails 3.2.2を使用していますが、RVMを使用して3.2.9で試しましたが、同じ結果になりました。これは開発中であり、データベースとしてpostgresqlを実行しています。

私は開発中で実行しているので、後のテスト日に到達するまでattr_accessibleを使用していません。ここで私が見た同様の質問はすべて、ブールフィールドをattr_accessibleに追加するのを忘れたことに関連しているようです。したがって、問題ではないことを事前に全員に知らせてください。

機能的な観点から、アプリのこの部分は基本的に、ユーザーがスケジュールできるイベント(またはタスク)のリストです。その日のすべてのタスクのリストを取得するインデックスページがあります。次に、ユーザーはタスクの横にあるチェックボックスをクリックすると、ajax呼び出しを介して問題のブールフィールドを使用してタスクが完了したように更新されます。

インデックスビューの関連セクションは次のとおりです。

=render :partial => "mktg/home/tasks"

そしてここに部分的な_tasks.html.hamlがあります

#mktg_home_tasks
- @tasks = Mktg::Event.where('DATE(starts_at) = DATE(?)', Date.today).all
- if @tasks.empty?
  You currently have no tasks...
- else
  - @tasks.each do |t|
    = form_for t, :index => t.id, :remote => true do |task|
      = task.check_box :completed
      - if task.object.completed == true
        = link_to task.object.title,{}, :class => 'strike_through'
      - else
        = link_to task.object.title

イベントコントローラの更新メソッドは、基本的にスキャフォールドです。

def update
@event = Mktg::Event.find(params[:id])

respond_to do |format|
  if @event.update_attributes(params[:event])
    format.js
    format.html { redirect_to @event, :notice => 'Event was successfully updated.' }
    format.json { head :no_content }
  else
    format.html { render :action => "edit" }
    format.json { render :json => @event.errors, :status => :unprocessable_entity }
  end
end

終わり

update.js.coffeeは次のとおりです。

jQuery ->
  $('#mktg_home_tasks').empty()
  $('#mktg_home_past_due').empty()

  $('#mktg_home_tasks').append("<%= escape_javascript(render 'mktg/home/tasks')%>")

チェックボックスのjqueryを介してフォーム送信を開始する次のアセットを実行しています。

編集:下の最初のコメントから、私の投稿には下のインデントが正しくありませんでした。

jQuery ->
  $(":checkbox").live "change", ->
    $(this).parents("form:first").submit()

アプリをそのまま実行すると、データベースに値がコミットされません。コンソールダンプは次のようになります。

Started PUT "/mktg/events/133" for 127.0.0.1 at 2012-12-10 17:21:42 -0800
Processing by Mktg::EventsController#update as JS
Parameters: {"utf8"=>"✓",     authenticity_token"=>"5ahLYhEjY2QEh6G0XOrathPXMSMaiDoCAgABpDbCZck=", "mktg_event"=>{"133"=>{"completed"=>"1"}}, "id"=>"133"}
Mktg::Event Load (0.3ms)  SELECT "mktg_events".* FROM "mktg_events" WHERE "mktg_events"."id" = $1 ORDER BY starts_at ASC LIMIT 1  [["id", "133"]]
(0.2ms)  BEGIN
(0.3ms)  SELECT "mktg_leads".id FROM "mktg_leads" INNER JOIN "mktg_event_leads" ON "mktg_leads"."id" = "mktg_event_leads"."lead_id" WHERE "mktg_event_leads"."event_id" = 133
(0.2ms)  COMMIT
Mktg::Event Load (0.5ms)  SELECT "mktg_events".* FROM "mktg_events" WHERE (DATE(starts_at) = DATE('2012-12-10')) ORDER BY starts_at ASC
Rendered mktg/home/_tasks.html.haml (3.4ms)
Rendered mktg/events/update.js.coffee (4.9ms)
Completed 200 OK in 66ms (Views: 6.0ms | ActiveRecord: 4.8ms)

そこで、次のbefore_saveメソッドをイベントモデルに追加してみました。

def set_completed_value
  if self.completed == 0
    self.completed = false
  else
    self.completed = true
  end
end

これを追加すると、完了したイベントを選択でき、データベースフィールドをtrueで更新することで機能します。これは、そこからのコンソール出力です。

Started PUT "/mktg/events/133" for 127.0.0.1 at 2012-12-10 16:48:59 -0800
Processing by Mktg::EventsController#update as JS
Parameters: {"utf8"=>"✓", "authenticity_token"=>"5ahLYhEjY2QEh6G0XOrathPXMSMaiDoCAgABpDbCZck=", "mktg_event"=>{"133"=>{"completed"=>"1"}}, "id"=>"133"}
Mktg::Event Load (0.3ms)  SELECT "mktg_events".* FROM "mktg_events" WHERE "mktg_events"."id" = $1 ORDER BY starts_at ASC LIMIT 1  [["id", "133"]]
(0.1ms)  BEGIN
(0.4ms)  SELECT "mktg_leads".id FROM "mktg_leads" INNER JOIN "mktg_event_leads" ON "mktg_leads"."id" = "mktg_event_leads"."lead_id" WHERE "mktg_event_leads"."event_id" = 133
(0.3ms)  UPDATE "mktg_events" SET "completed" = 't', "updated_at" = '2012-12-11 00:48:59.877945' WHERE "mktg_events"."id" = 133
(0.5ms)  COMMIT
Mktg::Event Load (0.3ms)  SELECT "mktg_events".* FROM "mktg_events" WHERE (DATE(starts_at) = DATE('2012-12-10')) ORDER BY starts_at ASC
Rendered mktg/home/_tasks.html.haml (29.4ms)
Rendered mktg/events/update.js.coffee (31.0ms)
Completed 200 OK in 36ms (Views: 31.8ms | ActiveRecord: 1.8ms)

しかし、チェックボックスの選択を解除して完了したイベントを未完了としてマークすると、データベースは更新されません。コンソール出力は次のとおりです。

Started PUT "/mktg/events/133" for 127.0.0.1 at 2012-12-10 16:49:14 -0800
Processing by Mktg::EventsController#update as JS
Parameters: {"utf8"=>"✓", "authenticity_token"=>"5ahLYhEjY2QEh6G0XOrathPXMSMaiDoCAgABpDbCZck=", "mktg_event"=>{"133"=>{"completed"=>"0"}}, "id"=>"133"}
Mktg::Event Load (0.2ms)  SELECT "mktg_events".* FROM "mktg_events" WHERE "mktg_events"."id" = $1 ORDER BY starts_at ASC LIMIT 1  [["id", "133"]]
(0.2ms)  BEGIN
(0.3ms)  SELECT "mktg_leads".id FROM "mktg_leads" INNER JOIN "mktg_event_leads" ON "mktg_leads"."id" = "mktg_event_leads"."lead_id" WHERE "mktg_event_leads"."event_id" = 133
(0.1ms)  COMMIT
Mktg::Event Load (0.4ms)  SELECT "mktg_events".* FROM "mktg_events" WHERE (DATE(starts_at) = DATE('2012-12-10')) ORDER BY starts_at ASC
Rendered mktg/home/_tasks.html.haml (3.4ms)
Rendered mktg/events/update.js.coffee (4.8ms)
Completed 200 OK in 9ms (Views: 5.5ms | ActiveRecord: 1.2ms)

データベースのブール値を更新するためのチェックボックスを取得するために、そのようなbefore_saveメソッドを追加する必要はありませんでした。だから私は何か間違ったことをしているに違いない。私は近くにいることを知っています。誰かが助けや提案を持っているなら、私は本当にそれをいただければ幸いです。

ありがとうございました...

編集:ジョン・ネーグルによって与えられた答えを試してみてください

私が変更され

= form_for t, :index => t.id, :remote => true do |task|

= form_for t, :index => t.id, :as => :event, :remote => true do |task|

そして、私は次のコンソール出力を取得します

Started PUT "/mktg/events/133" for 127.0.0.1 at 2012-12-11 09:48:14 -0800
Processing by Mktg::EventsController#update as JS
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"5ahLYhEjY2QEh6G0XOrathPXMSMaiDoCAgABpDbCZck=", "event"=>{"133"=>{"completed"=>"1"}}, "id"=>"133"}
  Mktg::Event Load (0.2ms)  SELECT "mktg_events".* FROM "mktg_events" WHERE "mktg_events"."id" = $1 ORDER BY starts_at ASC LIMIT 1  [["id", "133"]]
   (0.1ms)  BEGIN
   (0.1ms)  ROLLBACK
Completed 500 Internal Server Error in 2ms

ActiveRecord::UnknownAttributeError (unknown attribute: 133):
  app/controllers/mktg/events_controller.rb:89:in `block in update'
  app/controllers/mktg/events_controller.rb:88:in `update'

変更しようとしているレコードIDは133です(これは上記の「不明な属性」です)。

これが行番号を使用したUpdateメソッドです

#85  def update
#86  @event = Mktg::Event.find(params[:id])
#87
#88  respond_to do |format|
#89    if @event.update_attributes(params[:event])
#90      format.js
#91      format.html { redirect_to @event, :notice => 'Event was successfully updated.' }
#92      format.json { head :no_content }
#93    else
#94      format.html { render :action => "edit" }
#95      format.json { render :json => @event.errors, :status => :unprocessable_entity }
#96    end
#97  end
#98 end

他に試すべきことはありますか、それとも私のコードにエラーがありますか。再度、感謝します。

編集:下からジョン・ネーグルの答えを使用して、私は今これが機能しています

= form_for t, :index => t.id, :as => :event, :remote => true do |task|

上記により、次のコンソール出力とその後のエラーが発生していました。

"event"=>{"133"=>{"completed"=>"1"}}, "id"=>"133"}

:indexを削除することにより、レコードIDが誤って渡されるのを防ぎました。これに変更したら:

= form_for t, :as => :event, :remote => true do |task|

すべてが正しく機能し始めました。助けてくれてありがとう!このサイトと助けてくれる人たちがいなかったら、どうやって「行き詰まってしまう」のかわからない。私はこの場所が大好きです。

4

1 に答える 1

3

あなたのコントローラーがこれを行うように私には見えます:

@event.update_attributes(params[:event])

ただし、投稿パラメータは次のとおりです。

"utf8"=>"",
 "authenticity_token"=>"5ahLYhEjY2QEh6G0XOrathPXMSMaiDoCAgABpDbCZck=",
 "mktg_event"=>{"133"=>{"completed"=>"0"}},
 "id"=>"133"}

params [:event]は空です。

于 2012-12-11T04:01:26.740 に答える