Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

update_attributes field tweaks

So I've got an edit page that has butt-load of editable fields on it...simple update... @patient.update_attributes(params[:patient])...everything's great, except....

I've got one field out of these 20 that I need to tweak a little before it's ready for the db and it would seem I either need to do

  1. two trips
    @patient.update_attributes(params[:patient])
    @patient.update_attribute( :field=>'blah')

  2. or set them all individually
    patient.update_attributes(:field1=>'asdf', :field2=>'sdfg',:field3=>'dfgh', etc...)

Am I missing a way to do this is one swoop?

like image 658
bopritchard Avatar asked Mar 10 '11 18:03

bopritchard


2 Answers

What's the attribute you need to tweak? There's two ways to do this:

Either massage the params before you send them to the update_attribute method:

I'm just giving an example here if you wanted to underscore one of the values:

params[:patient][:my_tweak_attribute].gsub!(" ", "_")
@patient.update_attributes(params[:patient])

Then there's the preferred way of doing your tweaking in a before_save or before_update callback in your model:

class Patient < ActiveRecord::Base
  before_update :fix_my_tweak_attribute, :if => :my_tweak_attribute_changed?

  protected
    def fix_my_tweak_attribute
      self.my_tweak_attribute.gsub!(" ", "_")
    end
end

This keeps your controller clean of code that it probably doesn't really need.

If you just need to add a new param that didn't get sent by the form you can do it in the controller like this:

params[:patient][:updated_by_id] = current_user.id
@patient.update_attributes(params[:patient])

Assuming current_user is defined for you somewhere (again, just an example)

like image 118
nzifnab Avatar answered Oct 22 '22 20:10

nzifnab


You can create a virtual attribute for that field. Say the field is :name. You create a function in your Patient model like :

def name
  self[:name] = self[:name] * 2
end

And of course, you do your things inside that function :) Instaed of self[:name], you can also use read_attribute(:name).

like image 20
Spyros Avatar answered Oct 22 '22 21:10

Spyros