update_attributes字段调整

时间:2011-03-10 18:08:10

标签: ruby-on-rails

所以我有一个编辑页面上有可编辑字段的对接...简单更新... @patient.update_attributes(params[:patient]) ......一切都很棒,除了....

我在这20个中有一个字段,我需要在它准备好db之前稍微调整一下,看起来我或者需要做

  1. 两次旅行 @patient.update_attributes(params[:patient])
    @patient.update_attribute( :field=>'blah')

  2. 或单独设置它们 patient.update_attributes(:field1=>'asdf', :field2=>'sdfg',:field3=>'dfgh', etc...)

  3. 我错过了这样做的方法吗?

2 个答案:

答案 0 :(得分:4)

调整所需的属性是什么?有两种方法可以做到这一点:

在将params发送到update_attribute方法之前按下params:

如果您想强调其中一个值,我只是在这里给出一个例子:

params[:patient][:my_tweak_attribute].gsub!(" ", "_")
@patient.update_attributes(params[:patient])

然后在模型中的before_save或before_update回调中进行调整的首选方法是:

class Patient < ActiveRecord::Base
  before_update :fix_my_tweak_attribute, :if => :my_tweak_attribute_changed?

  protected
    def fix_my_tweak_attribute
      self.my_tweak_attribute.gsub!(" ", "_")
    end
end

这可以让你的控制器清理掉它可能并不真正需要的代码。

如果您只需要添加一个未通过表单发送的新参数,您可以在控制器中执行此操作:

params[:patient][:updated_by_id] = current_user.id
@patient.update_attributes(params[:patient])

假设current_user已在某处定义(再次,只是一个例子)

答案 1 :(得分:2)

您可以为该字段创建虚拟属性。说该字段是:名称。您可以在Patient模型中创建一个函数,如:

def name
  self[:name] = self[:name] * 2
end

当然,你在那个函数中做你的事情:)自己[:name]的Instaed,你也可以使用read_attribute(:name)。