我的項目的原始,愉快地工作版本是這樣的:更新屬性只有當屬性已更改
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,但是這也不起作用。
美麗的感謝。朋友共享的另一種方式是在if之前寫入「@ request.attributes = request_params」,然後使用以下組合的if語句:「if @ request.changed?&& @ request.save」 – james
'@request.attributes '是'assign_attributes'的別名,也就是相同的 –