Search code examples
ruby-on-railsruby-on-rails-3modelscontrollersbefore-save

How to prevent updating a single attribute in Rails?


When a form is submitted, how to prevent a single attribute from being updated in Rails? All other attributes should be updated.

Is it before_save, attr_reader or some other way?

If using before_save, how to access to the attributes hash?

Rails 3.0.7


Solution

  • Check out attr_protected.

    Class YourModel << ActiveRecord::Base
    
      attr_protected :the_one_column, as: :update
    
      # ...
    end
    

    Now as part of a call to update_attributes, you'd specify the :update role, for example

    klass = YourModel.find(some_id)
    klass.update_attributes(params[:your_model], as: :update)
    

    If :the_one_column is set in params passed to update_attributes, it will throw an error.

    As @Beerlington mentioned in his comment to your Question, you should also check out attr_accessible. It's generally better to spend the 30 minutes going through all models of your application white-listing attributes using attr_accessible than it is to blacklist specific attributes with attr_protected.