attributes=
attributes=(new_attributes, guard_protected_attributes = nil)Allows you to set all the attributes at once by passing in a hash with keys matching the attribute names (which again matches the column names).
If any attributes are protected by either attr_protected or attr_accessible then only settable attributes will be assigned.
The guard_protected_attributes argument is now deprecated, use the assign_attributes method if you want to bypass mass-assignment security.
class User < ActiveRecord::Base attr_protected :is_admin end user = User.new user.attributes = { :username => 'Phusion', :is_admin => true } user.username # => "Phusion" user.is_admin? # => false
3Notes
Update attributes on mulitple models
Updates attributes on multiple models, saves each if validations pass.
def update_multiple
@items = Item.find(params[:item_ids])
@items.each do |item|
item.attributes = params[:item].reject { |k,v| v.blank? }
end
if @items.all?(&:valid?)
@items.each(&:save!)
flash[:notice] = "Updated items!"
redirect_to items_path
else
flash[:notice] = "Please enter valid data."
render :action => 'edit_multiple'
end
end
Use super to override, and not alias_method_chain
Somehow, If you want to extend the behaviour of attributes=,
alias_method_chain does not work. It simply breaks (could not find out how exactly).
def attributes_with_some_feature=(new_attributes, guard_protected_attributes = true)
attributes_without_some_feature=(new_attributes, guard_protected_attributes)
end
alias_method_chain :attributes=, :some_feature
this breaks the code. dynamic finders and assignments didn't work as before (Even though no behaviour has changed yet).
Instead,
def attributes=(new_attributes, guard_protected_attributes = true)
# custom code
super(new_attributes, guard_protected_attributes)
end
does work as expected.
I prefer using alias_method_chain for breaking open existing functionality, but in this case it won't work.
the source is wrong!
in 3.0.5, the source code in line 15 looks like this: respond_to?(:"#{k}=") ? send(:"#{k}=", v) : raise(UnknownAttributeError, "unknown attribute: #{k}")
whats wrong with apidock?