如何使用Rails上的参数动态更改模型的字段?

时间:2012-05-25 05:50:27

标签: ruby-on-rails ruby activerecord model

我对Ruby on Rails上的模型有疑问:

我在Rails上有这个方法,它接收列的名称和该列的新值:

def change_attribute
    field = params[:field]
    new_value = params[:new_value]
    person = Person.find(params[:id])
    person.update_attribute(field, new_value)
    render :text=>"", :layout=>false
end

但这会引发一个错误:该字段不存在,我认为它应该是:name,:lastname等。

如何将我的字段变量转换为其中一个以使此功能正常工作?

1 个答案:

答案 0 :(得分:2)

您应该检查params[:field]中的字段名称是否与原始字段名称完全相同(没有多余的空格等)。您可以通过puts params[:field].inspect进行检查并在终端中检查它(rails服务器的启动位置)。

根据update_attribute的文档,我们可以将字符串或符号作为字段名称传递。因此,在将字段参数传递给update_attribute之前,您无需担心将其转换为符号。正如您所见,来源:

def update_attribute(name, value)
  name = name.to_s
  raise ActiveRecordError, "#{name} is marked as readonly" if self.class.readonly_attributes.include?(name)
  send("#{name}=", value)
  save(:validate => false)
end

首先将其转换为字符串,然后调用setter。正如@jdoe所提到的,它没有验证模型(请参阅代码中的save(:validate => false)行),因此在使用此方法时应注意这一点。