daryl daryl - 3 years ago 121
Ruby Question

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


tracking table:

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


Could anyone steer me in the right direction, if something could be refactored?

Answer Source

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 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

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

Program logic

Normally we don't 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
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download