2011-11-30 57 views
2

用戶單擊一個按鈕以上傳項目。這應該更新@ item.upvotes。Rails中的upvote方法屬於哪裏?

這是哪裏去的?這是我想到的選項。我並不是非常熟悉正確的條塊分割,我也希望瞭解這背後的原因。

  1. 模式 - 作爲立即更新
  2. 控制器實例方法 - 一個是被使用的路由調用的方法。如果是這種情況,我們爲什麼要這樣做而不是在模型上創建實例方法?
  3. 助手 - 我不太熟悉這些操作,但我知道他們可以從視圖中調用。但是,它們似乎更適合於字符串操作或處理屬於視圖的內容。
+0

要添加一些說明: 1 - 皮特說,該模型是驗證和關係 2 - 控制器之間的膠水你意見和模型。這裏的大部分功能通常都是 3 - 幫助者可以幫助生成表單元素afaik。例如。 form_for()是一個幫手 –

回答

3

正確的方法是讓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" 
+1

'@item.upvote = @ item.upvote + 1'是一個壞主意,增量應該完全發生在數據庫內部以避免併發問題,AR甚至有方法來支持這些事情。 –

+0

感謝您的糾正,修復它。 – Pete

+2

我認爲你正在尋找['increment_counter'](http://api.rubyonrails.org/classes/ActiveRecord/CounterCache.html#method-i-increment_counter)方法,它在數據庫中執行直接更新,並且不會' t需要跟一個'save'調用。 –