【问题标题】:how do I change a field of a model dynamically using a parameter on Rails?如何使用 Rails 上的参数动态更改模型的字段?
【发布时间】:2012-05-25 05:50:26
【问题描述】:

我对 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 等。

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

【问题讨论】:

  • update_attribute 跳过验证。小心使用!

标签: ruby-on-rails ruby activerecord model


【解决方案1】:

您应该检查您在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) 行),因此在使用此方法时应该注意这一点。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    相关资源
    最近更新 更多