2011-03-21 38 views
0

更新:此問題底部的控制器代碼可解決此問題。 我正在努力更新rails 3中的boolean confirmed_flag字段。背景:用戶可以託管事件並可以通過出席模型(HATM)參加事件。 我有一個使用單選按鈕,以允許客人被接受或從事件下降了的form_for助手:Rails - 通過控制器更新布爾值

<%= form_for(@attendance) do |f| %> 
<%= render 'shared/error_messages', :object => f.object %> 
    <div class="field"> 
    <strong>Event description: </strong><%= @attendance.event.description %><br/> 
<%= f.radio_button :confirmed_flag, 1 %>Accept 
<%= f.radio_button :confirmed_flag, 0 %>Decline 

這將顯示精細和掛鉤成以下控制器更新動作:

def update 
    @attendance = Attendance.find(params[:id]) 
    respond_to do |format| 
    if @attendance.update_attributes(params[:attendance][:confirmed_flag]) 
     format.html { redirect_to(@attendance, 
        :notice => 'Attendance was successfully updated.') } 
     format.xml { head :ok } 
    else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @attendance.errors, 
        :status => :unprocessable_entity } 
    end 
    end 
end 

作爲你可以看到,我希望form_for的結果能夠更新confirmed_flag,但是當我在rails控制檯中查看特定出勤的值時,我已經更新爲表單中的'Accept',confirm_flag的值仍然爲零。

任何幫助極大的讚賞。

編輯:有關服務器日誌片斷附:

Started POST "/attendances/10" for 127.0.0.1 at 2011-03-21 23:42:18 +0000 
    Processing by AttendancesController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"Oz5qO/bcEJGmzIEH0xDOvtv7ecbF4wXXHpUtlIkDnfc=", "attendance"=>{"confirmed_flag"=>"1"}, "commit"=>"Update", "id"=>"10"} 
    [1m[36mAttendance Load (15.6ms)[0m [1mSELECT "attendances".* FROM "attendances" WHERE "attendances"."id" = 10 LIMIT 1[0m 
Redirected to http://127.0.0.1:3000/attendances/10 
Completed 302 Found in 109ms 

更新:在控制器下面的代碼完美的作品。感謝大家一如既往的幫助。

def update 
     @attendance = Attendance.find(params[:id]) 
     respond_to do |format| 
    if 
     @attendance.update_attributes({:confirmed_flag => params[:attendance][:confirmed_flag]}) 
     format.html { redirect_to(@attendance, 
        :notice => 'Attendance was successfully updated.') } 
     format.xml { head :ok } 
    else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @attendance.errors, 
        :status => :unprocessable_entity } 
      end 
     end 
    end 
+0

你可以發表你的日誌或服務器日誌,看看是否PARAMS實際上獲得通過 – s84 2011-03-21 22:57:07

+0

加入到主要問題機構。謝謝。 – dzn 2011-03-22 00:09:18

回答

1

我認爲有條件的應該說這一點。

@attendance.update_attributes({:confirmed_flag => params[:attendance][:confirmed_flag]}) 
+0

一旦再次,不幸的是,這也是行不通的。鑑於上面的條件只是傳入一個屬性,爲什麼不update_attribute方法工作(我試過了,它沒有 - 給出了一個錯誤消息,說1 2變量)? – dzn 2011-03-21 23:56:34

+0

當請求進來時,你可以發佈日誌文件的部分嗎 – Shiv 2011-03-22 00:03:41

+0

發表在主要問題主體。感謝你的協助... – dzn 2011-03-22 00:08:57

0

我認爲如果您刪除更新語句的[:confirmed_flag]部分,它可能會工作。

所以才:

if @attendance.update_attributes(params[:attendance]) 

我不是100%肯定,但方法的update_attributes可能會尋找考勤領域嵌套「confirmed_flag」

+0

不幸的是,沒有工作。在控制檯中,我可以使用以下方法成功運行更新:b = Attendance.find(1)#new line b.update_attribute(:confirmed_flag,1)。另一個想法是,有沒有辦法使用update_attribute方法(而不是update_attributes),並以某種方式將單選框的值傳遞給單元方法? – dzn 2011-03-21 23:02:13

2

內從您的評論我的其他答案:

有使用 update_attribute方法(而不是 update_attributes方法)並以某種方式傳遞的方式單選框的值爲 單元格方法?

您可以手動做到這一點:

@attendance.confirmed_flag = (params[:confirmed_flag] == "1") 
@attendance.save 
+0

我認爲你的意思是將這2行加到控制器上,但是這並沒有保存標誌:\t def update @attendance = Attendance.find(params [:id]) respond_to do | format | if \t @attendance。confirm_flag =(params [:confirmed_flag] ==「1」) \t @ attendance.save format.html {redirect_to(@attendance, :notice =>'出席成功更新')} format.xml {head :OK】 其他 format.html {渲染:行動=> 「編輯」} format.xml {渲染:XML => @ attendance.errors, :狀態=>:unprocessable_entity} 結束 結束 結束 – dzn 2011-03-21 23:14:24