2012-09-09 69 views
0

我對Ruby on Rails非常陌生,我來自PHP,並且我意識到它不僅僅是簡化語法,還有很多良好的結構實踐。Rails mysql更新

雖然我目前的工作,我幾乎可以肯定,我不是最好的方式。

這是我正在做的。我通過AJAX跟蹤點擊次數並更新數據庫中的記錄以監控流行的接入點。

這裏是我的控制器:

class AjaxController < ApplicationController 

    def track  
    elem = Tracking.where('element = ?', params[:element]).first 
    if elem.nil? 
     Tracking.create(:element => params[:element], :count => 0) 
    else 
     elem.count = elem.count + 1 
     elem.save 
    end 
    render :text => 'ok' 
    end 

    def validate 
    if request.xhr? && respond_to?(params[:callback]) 
     return self.send(params[:callback]) 
    end 
    no_access 
    end 

    private 

    def no_access 
    redirect_to root_url 
    end 

end 

這裏是我的模型:

class Tracking < ActiveRecord::Base 
    attr_accessible :element, :count 
end 

跟蹤表:

+-------------------------+ 
| id | element | count | 
+-------------------------+ 
| 1 | bazinga | 3 | 
--------------------------- 

任何人都可以引導我在正確的方向,如果有什麼可以重構?

回答

2

我會看到一些關於Rails轉換的重新考慮因素。但是,如果您有任何特定的原因,這些可能會過度滾動。

1 - 您的型號名稱(我想這個你有正確的,只是仔細檢查表名)

理想的情況下Rails會在單數複數的表和模式。所以你的表應該是trackings和你的模式應該是Tracking

2 - 控制器

既然你是指你的跟蹤模型,按照慣例,該控制器名稱應該是TrackingsController

和Rails使用REST方法,所以儘量保持默認的7控制器操作(只要它們在上下文中有意義)。默認REST控制器動作

index 

show 

new 

create 

edit 

update 

destroy 

因此,我認爲你的點擊可以匹配爲Trackings -> create

大概no_access方法可以移動到ApplicationController中,因爲它可以通過任何控制器

程序中使用邏輯

通常我們不會在控制器中寫域登錄,所以您在控制器中的下面部分

elem = Tracking.where('element = ?', params[:element]).first 
if elem.nil? 
    Tracking.create(:element => params[:element], :count => 0) 
else 
    elem.count = elem.count + 1 
    elem.save 
end 

可以移動到模型像

class Tracking < ActiveRecord::Base 
    attr_accessible :element, :count 

    def self.track(params) 
    #your creation and counter update login 
    end 

end 

,並在控制器

def create 
    Tracking.track(params) 
    render :text => 'ok' 
end 
1

您的控制器可以從一些RESTful設計中受益。讓你的控制器使用資源--AjaxController不是一個例子。

通過將no_access移動到ApplicationController並添加CanCan進行授權來幹您的代碼。

您的模型很好,但您可能需要驗證。並在模式中指定不爲null。

最後,繼續閱讀其他人的代碼。並繼續編寫自己的代碼。你會在時間上更好。

1

除了什麼sameera207說,你或許可以縮短髮現或創造與記錄過程find_or_create_方法:

Tracking.find_or_create_by_element(params[:element]) 

編輯

您可以處理具有增加的值:

tracking = Tracking.find_or_create_by_element(params[:element]) do |t| 
    t.count = 1 
end 
tracking.count += 1 
tracking.save 
+0

我讀到的是,問題是如果存在的話,我會增加計。 – daryl