我有一个带复选框的表单,可启用/禁用其他字段:
<%= 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'之前调用。这是最好的方法吗?还有其他选择吗?
答案 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”,这就行了。不过,我不确定是否可以强制执行该命令。