2014-01-23 107 views
13

我的項目的原始,愉快地工作版本是這樣的:更新屬性只有當屬性已更改

1)用戶填寫表格(新的行動),並點擊提交(create動作)

2)用戶被重定向到他們的編輯頁面(編輯操作使用由模型創建的edit_id,而不是Rails自動生成的id),它顯示信息用戶已經提交

3)用戶可以選擇更改信息)並重新提交

I在此版本中,即使用戶在編輯頁面中沒有任何內容改變並提交,該頁面仍會閃爍成功提醒。

從數據庫的角度來看,我並不在意,因爲表單已經預先填充了用戶的信息,所以update_attributes方法只是用相同的信息覆蓋舊的信息。

從用戶的角度來看,這很煩人,所以我想確保只更新信息,只有當用戶實際上改變了某些東西時,成功警報纔會閃現。

我想這將是很容易,改變從這個舊代碼:

def update 
    @request = Request.find_by_edit_id(params[:edit_id]) 
    if @request.update_attributes(request_params) 
    flash[:success] = true 
    redirect_to edit_request_path(@request.edit_id) 
    else 
    render 'edit' 
    end 
end 

並添加一個額外的組件,以「如果」是這樣的:

def update 
    @request = Request.find_by_edit_id(params[:edit_id]) 
    if @request.update_attributes(request_params) && @request.changed? 
    flash[:success] = true 
    redirect_to edit_request_path(@request.edit_id) 
    else 
    render 'edit' 
    end 
end 

但是這並未」工作。現在發生的事情是,在編輯頁面上,如果我不更改任何信息並點擊提交,則什麼都不會發生(這很棒),但是如果我更改了信息並點擊提交,仍然沒有任何反應(這很糟糕)。我究竟做錯了什麼?

注:我最初認爲這是一個操作錯誤的順序,所以我使它成爲一個嵌套的if,第一個是@ request.update_attributes,第二個是@ request.changed,但是這也不起作用。

回答

20

update_attributes方法包含'save'調用作爲其方法的一部分,如果保存成功則返回true。我想你正在尋找這樣的東西使用assign_attributes

def update 
    @request = Request.find_by_edit_id(params[:edit_id]) 
    @request.assign_attributes(request_params) 

    if @request.changed? 
    if @request.save 
     flash[:success] = true 
     redirect_to edit_request_path(@request.edit_id) 
    else 
     render 'edit' 
    end 
    else 
    # Action if no change has been made 
    end 
end 
+0

美麗的感謝。朋友共享的另一種方式是在if之前寫入「@ request.attributes = request_params」,然後使用以下組合的if語句:「if @ request.changed?&& @ request.save」 – james

+1

'@request.attributes '是'assign_attributes'的別名,也就是相同的 –