用戶單擊一個按鈕以上傳項目。這應該更新@ item.upvotes。Rails中的upvote方法屬於哪裏?
這是哪裏去的?這是我想到的選項。我並不是非常熟悉正確的條塊分割,我也希望瞭解這背後的原因。
- 模式 - 作爲立即更新
- 控制器實例方法 - 一個是被使用的路由調用的方法。如果是這種情況,我們爲什麼要這樣做而不是在模型上創建實例方法?
- 助手 - 我不太熟悉這些操作,但我知道他們可以從視圖中調用。但是,它們似乎更適合於字符串操作或處理屬於視圖的內容。
用戶單擊一個按鈕以上傳項目。這應該更新@ item.upvotes。Rails中的upvote方法屬於哪裏?
這是哪裏去的?這是我想到的選項。我並不是非常熟悉正確的條塊分割,我也希望瞭解這背後的原因。
正確的方法是讓upvote按鈕(視圖)通過路由到正確的方法調用控制器。在控制器方法內部,您告訴模型更新字段。這是MVC原則。
Rails中的模型通常只包含驗證,關係等。更新字段顯然是控制器的一項工作。
我不流利與我的紅寶石更多,因爲我用java,但現在控制器或許應該是這個樣子:
class ItemsController
def upvote
Items.increment_counter(:upvote, params[:id])
end
在你有一個按鈕某處視圖(通過形式或的link_to),其職位ID說一個「/給予好評」行動:
<%= link_to "upvote", upvote_path(:id => @item.id) %>
在你的路由文件,你發送給項目#給予好評。
match "/upvote" => "items#upvote"
'@item.upvote = @ item.upvote + 1'是一個壞主意,增量應該完全發生在數據庫內部以避免併發問題,AR甚至有方法來支持這些事情。 –
感謝您的糾正,修復它。 – Pete
我認爲你正在尋找['increment_counter'](http://api.rubyonrails.org/classes/ActiveRecord/CounterCache.html#method-i-increment_counter)方法,它在數據庫中執行直接更新,並且不會' t需要跟一個'save'調用。 –
計數器緩存不適用於此處。沒有'Vote'模型,因此沒有'belongs_to'關係來添加計數器緩存。 – Mischa
要添加一些說明: 1 - 皮特說,該模型是驗證和關係 2 - 控制器之間的膠水你意見和模型。這裏的大部分功能通常都是 3 - 幫助者可以幫助生成表單元素afaik。例如。 form_for()是一個幫手 –