2012-09-29 276 views
0

我有一個應用程序,其中包含調用。每個電話都可以取消。當在取消操作中取消一個調用時,我會呈現一個cancel_form,它給了用戶一個取消原因,以便從中選擇並利用更新操作來寫入參數。Rails更新操作在我的某個字段中注入Null

它功能很好,但是每當我使用它它抹去我的transfer_date字段。參數顯示正確設置的cancel_reason_id,然後它將transfer_date設置爲NULL。我在代碼中沒有涉及transfer_date的內容,所以我很困惑。

這裏則params的代碼和輸出:

Params: 
Processing by CallsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"SoiMjWjeMFXXeiA9N8nNwfIQDa7pbB0YS9XkmKY6AuQ=", "call"=>{"cancel_reason_id"=>"1"}, "button"=>"", "id"=>"183"} 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = 14 LIMIT 1 
    Call Load (0.3ms) SELECT "calls".* FROM "calls" WHERE "calls"."id" = $1 LIMIT 1 [["id", "183"]] 
    (0.1ms) BEGIN 
    (0.6ms) UPDATE "calls" SET "cancel_reason_id" = 1, "transfer_date" = NULL, "updated_at" = '2012-09-29 18:02:03.315975' WHERE "calls"."id" = 183 
    (1.9ms) COMMIT 

CallsController取消行動:

def cancel 
     @call = Call.find(params[:id]) 

     attrs = { 
      call_status: 'cancel', 
      incharge_id: @call.units.first.incharge_id, 
      attendant_id: @call.units.first.attendant_id 
     } 
     attrs.merge!({ incharge2_id: @call.units.second.incharge_id, attendant2_id: @call.units.second.attendant_id }) if @call.units.count == 2 

     if @call.update_attributes(attrs) 
      @call.units.each do |unit| 
      CallMailer.cancel_call(unit.incharge, @call).deliver 
      CallMailer.cancel_call(unit.attendant, @call).deliver 
      end 
     render "cancel_form" 
     else 
      redirect_to calls_url, :error => "Whoops." 
     end 
     end 

Cancel_form視圖

<%= form_for(@call) do |f| %> 

    <%= f.label :cancel_reason %> 
    <%= f.collection_select(:cancel_reason_id, CancelReason.all, :id, :reason, {}, {:class => 'select'}) %> 

    <%= f.button :submit %> 

<% end %> 

我試圖創建一個獨立的cancel_reason行動,並加入一個路由,但它也顯然利用了更新操作,並將transfer_date設置爲NULL 。

我確實需要這個功能才能工作,但現在我已經解決了我的故障排除技巧。

任何幫助將不勝感激。

+0

我有params [:call] .parse_time_select! :我的更新操作中的transfer_date將我的日期/時間解析爲一個字段。如果我在一個if transfer_date = nil語句中包裝它,我可以使用正確的日期創建調用,並在cancel_reason視圖中保留一個日期。但是由於我沒有解析日期,所以偏斜了。除非邏輯在這裏使用,否則什麼是正確的? – nulltek

+0

我只在params key transfer_date存在的時候才試圖運行這個。這是我到目前爲止:if(params.has_key?(:transfer_date)) params [:call] .parse_time_select! :transfer_date 結束但它仍然不解析時間。我的邏輯錯了嗎? – nulltek

回答

0

可能你只是想在call模型中的attr_accessible中調用transfer_date?

+0

Nope,:transfer_date在Call模型中位於attr_accessible中。 – nulltek

+0

我忘記在更新操作中提到這行設置:params [:call] .parse_time_select! :transfer_date,因爲在cancel_reason上完成的更新沒有任何參數在transfer_date上讀取,我認爲它設置爲NULL。現在如何解決它? – nulltek

0
if params[:call].has_key? 'transfer_date(1i)' 
     params[:call].parse_time_select! :transfer_date 
    end 

通過包含這一條件語句我能夠運行僅包含params鍵transfer_date(1I)請求parse_time線。這最終解決了我的問題。

相關問題