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
tracking table:
+-------------------------+
| id | element | count |
+-------------------------+
| 1 | bazinga | 3 |
---------------------------
Could anyone steer me in the right direction, if something could be refactored?
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
trackingsand your model should beTracking2 – controller
Since you are referring to your Tracking model, by convention, the controller name should be
TrackingsController,And Rails uses a 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
So I think your click can be matched as
Trackings -> createand probably no_access method can be moved to ApplicationController, as it can be used by any controller
Program logic
Normally we don’t write the domain login in controller, so your below part in controller
can be moved to model like
and in your controller