2011-07-10 62 views
1

首先,我知道我想做的事對Rails來說並不典型。我願意提供更好的替代方案。我是新手與鐵軌,所以建議歡迎:)Rails:如何讓Jquery在點擊後更新數據庫列

基本上,我有一個通知欄,有5個通知。用戶單擊並看到通知後,我想將數據庫中名爲seen的列設置爲true。

這裏是我的jQuery函數:

<script type="text/javascript"> 
      $(document).ready(function(){ 
       $("button").click(function(){ 
        $("div#count").html("<%= escape_javascript(render('shared/notification_count')) %>"); 
       }); 
      }); 
</script> 

這裏是我想只有點擊後執行(位於_notification_count.html.erb)

<% notification_ids = current_user.notifications.map(&:id).join(', ')%> 
<% sql = "UPDATE notifications SET SEEN = true where id IN(#{notification_ids})" %> 
<% User.connection.select_all(sql) %> 

但是這些代碼後,看起來這個代碼在頁面加載時自動執行,而不是在點擊後執行。我的問題是什麼?

回答

3

首先,您不能簡單地將render附加到您的按鈕以更改數據庫(無論是讀取還是寫入)。你必須做出一個AJAX調用回你的控制器使用類似

$.ajax({ 
    url: "/path/to/your/method", 
    type: "GET", 
    dataType: "script" 
}); 

而在你的控制器,你會處理,你需要做什麼,然後用

respond_to do |format| 
    format.js {render 'shared/notification_count'} 
end 

這是使你的js文件因爲當用戶點擊你的按鈕時,代碼將在客戶端執行,但是如果你從不向服務器發回請求,那麼你將無法看到數據庫的更新版本。我建議你閱讀更多關於this,這幫助了我很多。

2

您的.erb文件的內容只是模板:在加載時進行評估。如果你想讓用戶交互觸發一些行爲,你必須純粹用javascript來完成。其結果是,該辦法有數據庫交互發生在這條產業鏈:

  1. 使用者做
  2. 控制器的JavaScript會談(通過要麼AJAX或提交表單)
  3. 控制器獲取正在討論的模型並要求它執行某些操作
  4. 該模型與數據庫交互。

因此,基本上在你的模型中,你需要有代碼來觸發這些通知。控制器只會在模型收到用戶/視圖請求時纔會這樣做。

+0

+1爲教育學。 – apneadiving