Rails mysql update
I'm pretty new to Ruby on Rails, I came from PHP and i've realised it's not just as simple as getting syntax down, there's a lot of good structure practices to take on board too.
While what I have currently works, I'm almost certain I'm not doing it the best way.
Here's what I'm doing. I'm tracking clicks via AJAX and updating a record in the database to monitor popular access points.
Here's my controller:
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
Here's my model:
class Tracking < ActiveRecord::Base attr_accessible :element, :count end
+-------------------------+ | id | element | count | +-------------------------+ | 1 | bazinga | 3 | ---------------------------
Could anyone steer me in the right direction, if something could be refactored?
Welcome to rails :), So I would see some re factoring with regarding to rails conversions. But these can be over rolled, if you have any specific reason.
1 - Your model name (I think this you got right, just double check the table name)
Ideally rails will have the tables in plural and models in the singular. so your table should be trackings and your model should be Tracking
2 - controller
Since you are referring to your Tracking model, by convention, the controller name should be TrackingsController,
and rails uses, REST approach, so try your best to keep your default 7 controller actions (as long as they are meaningful in the context.). default REST controller actions are
index show new create edit update destroy
So I think your click can be matched as Trackings -> create
and probably no_access method can be moved to ApplicationController, as it can be used by any controller
Normally we dont write the domain login in controller, so your below part in controller
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
can be moved to model like
class Tracking < ActiveRecord::Base attr_accessible :element, :count def self.track(params) #your creation and counter update login end end
and in your controller
def create Tracking.track(params) render :text => 'ok' end