我创建了一个大约有40个字段可供编辑的表单,我试图使用控制器将它们保存到数据库。我现在有这个代码:
c = Form.find(params[:id])
if c
params.each do |k,v|
c.k = params[:v]
end
不工作,我得到这个错误:undefined method 'k='
如果我要把它们都手工写出来,它会是这样的:
c = Form.find(params[:id])
if c
c.title = params[:title]
c.reference = params[:reference]
....
etc.
假设您正在尝试根据传入params
的内容更新Form
记录上的属性,请尝试以下作为基本大纲:
c = Form.find_by_id(params[:id])
if c
params.each do |k, v|
c[k] = v
end
c.save!
end
你原来的代码对params[:v]
的使用可能不是你想要的,而你真正想要的是params[:k]
。但是,实际上没有必要在循环中查找该键的值,因为在v
中已经有了该值。
下面是与ActiveRecord
属性交互方式的快速概述:http://www.davidverhasselt.com/2011/06/28/5-ways-to-set-attributes-in-activerecord/
我不知道你想做什么,但你的代码似乎很奇怪。解决方案如下
c.send "#{k}=", params[:v]
c = Form.find(params[:id])
c.update_attributes(params[:form])
注意,我猜[:form]
部分在第二行,这取决于你的形式。检查你的HTML源代码,看看你的字段是否像这样:
<input name="form[field_name]" ...
如您所见,name包含一个"类似数组"的形式。检查你的HTML源代码并调整(所以如果是name="foo[field_name]"
,你需要使用c.update_attributes(params[:foo])
)