I want to set the values of several record fields from within an
iterator where the field name is passed as a parameter. For example
(conceptually):
# Line numbers are for reference only and are not a part of the code.
1. record=Model.find(id)
2. params.each do |key,value|
3. eval('record.'+key)=value
4. end
Apparently, having the eval on the LHS of an assignment doesn't work.
Can anyone please tell me what would work?
I want to set the values of several record fields from within an
iterator where the field name is passed as a parameter. For example
(conceptually):
# Line numbers are for reference only and are not a part of the code.
1. record=Model.find(id)
2. params.each do |key,value|
3. eval('record.'+key)=value
4. end
Apparently, having the eval on the LHS of an assignment doesn't work.
Can anyone please tell me what would work?
record[key] = value
Note that this relies on the hash-like behavior of ActiveRecord. If you
wanted to do this with a non-AR object, you could use
record.send("#{key}=", value). eval is rarely necessary in Ruby.
However, in this case, you could just do
record.update_attributes(params).
First of all if you are doing this from a controller, you probably
don't want to use ALL of the parameters, but only those for the model,
probably coming from a form,
For an active record model you can do:
# Assuming that the model really is called Model, and you are
following Rails conventions for the form:
model_params = params[:model] ||
model_params.each do |key, value|
record[key] = value
end
or just
record.attributes=(model_params, false)
The false overrides the protection of attributes, and probably isn't a
good idea in general. You normally don't want to blindly mass assign
any attributes the user throws at you. Consider the fact that the
incoming url might be coming from a form submission from your app, or
might be forged.
Wow, two really thorough answers. Thanks so much. Sorry for the
delay in responding. I wanted to see if I couldn't get this thing
working before responding; but, alas, I ran into other problems.
However, I would have to say that this issue has definitely been put
to bed. Thanks for the input.
Oh, BTW:
# Assuming that the model really is called Model,
It isn't. I chose that name for illustrative purposes.