如何编写rails模型来处理依赖字段?

时间:2011-08-26 19:54:23

标签: ruby-on-rails

我有一个带复选框的表单,可启用/禁用其他字段:

<%= check_box_tag :enable %>
<%= text_input_tag :extra_parameter %>

如果enable为true,模型将存储额外参数。使用_tag,我需要将额外的参数从控制器传递给模型。

有没有办法使用表单构建器完成此操作并在模型中完全具有逻辑?

查看:

<%= f.check_box :enable %>
<%= f.text_input :extra_parameter %>

型号:

class ExampleModel < ActiveRecord::Base
  def enable=
     ????
  end

  def extra_parameter=
     self.extra_parameter = true if ???
  end
end

一种方法是实例变量 - 但这假设模型'enable'将在'extra_parameter'之前调用。这是最好的方法吗?还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

您需要通过覆盖initialize方法来执行此操作,以便能够在控制器中执行此类操作并使其正常工作:

ExampleModel.new(:extra_params => "Hello world", :enabled => true)

您的模型看起来如下所示,它会覆盖初始化,首先调用super来设置任何可访问的属性,然后使用我们的自定义设置器设置extra_params。我们需要按此顺序执行此操作,因为正如您所提到的,我们需要确保设置enabled并在我们决定是否设置extra_params时返回正确的布尔值。

class ExampleModel < ActiveRecord::Base
  def initialize(attrs={})
    super(attrs)
    self.extra_params = attrs.fetch(:extra_params, nil)
  end

  def extra_params=(value)
    self[:extra_params] = value if enabled?
  end
end

使用此方法,在新建对象时设置参数的顺序无关紧要。

答案 1 :(得分:0)

对于数据库中没有等效列的属性,您可以使用attr_accessor

attr_accessor :enable

def extra_parameter=(value)
    self[:extra_parameter] = value if enable
end

只要在质量分配中的“extra_parameter”之前传递“enable”,这就行了。不过,我不确定是否可以强制执行该命令。