开发者

update_attributes field tweaks

开发者 https://www.devze.com 2023-02-16 05:45 出处:网络
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....

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 o开发者_高级运维ne swoop?


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)


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

0

精彩评论

暂无评论...
验证码 换一张
取 消