Hmm, that seems to always return false over here.
I tried this:
update_was_successful = @item.update_attributes(params[:item])
puts @item.status_changed?
Which outputs false, always. The weird thing is that it prints that
before
the update is shown in the console. I guess that is why it’s always
false.
Isn’t the update_attributes method updating the item right away?
Since the params will give you either “0” or “1” as a string, and
since you are trying to equate “0” (string) to “false” (boolean), why
not set a variable equal to “true” or “false” based on the params?
Try:
if params[:item][:status] == “0”
bool = false
else
bool = true
end
Since the params will give you either “0” or “1” as a string, and
since you are trying to equate “0” (string) to “false” (boolean), why
not set a variable equal to “true” or “false” based on the params?
I have a form with a checkbox called “status” which is a boolean in the
database.
In my controller’s update action I want to check if the checkbox has
changed.
No, you really shouldn’t be doing that in the controller. You almost
certainly want to do this in a before_save (or possibly
before_validation) callback on the MODEL.
Several reasons:
it’s a best practice to keep business logic in the model (“fat
model / skinny controller”)
inside the model callbacks, you’ve got access to both typecast data
(the incoming status will already have the right type) and the
_changed? predicate. For instance, your code could be shortened to:
class Item < ActiveRecord::Base
before_save :update_position
def update_position
self.position = nil if status_changed?
end
end
Not only does it avoid the messy conversion, it (IMHO) is far more
readable.