Question

I have a situation where an attribute can be created through a JSON API. But once it is created, I want to prevent it from ever being updated.

This constraint causes my first solution, which is using attr_accessible, to be insufficient. Is there a nice way to handle this type of situation in rails, or do I have to perform a manual check in the update method?

Was it helpful?

Solution

You can use attr_readonly, this will allow the value to be set on creation, but ignored on update.

Example:

class User < ActiveRecord::Base
  attr_accessible :name
  attr_readonly :name
end


> User.create(name: "lorem")
> u = User.first
=> #<User id: 1, name: "lorem">
> u.name = "ipsum"
=> "ipsum"
> u.save
=> true
> User.first.name
=> "lorem"

OTHER TIPS

There is not a nice way to do that as far as I know, you have to write a custom filter

before_update :prevent_attributes_update

def prevent_attribute_updates
  %w(attr1, attr2).each do |a|
    send("#{attr1}=", send("#{attr1}_was")) unless self.send("#{attr1}_was").blank?
  end
end
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top