我正在寻找一个示例,说明如何为绑定到acts_as_tree 的对象的单选按钮列表创建自定义表单构建器。我已经有了显示单选按钮列表的代码,但想通过重构为表单生成器来干掉它。我找不到单选按钮列表的自定义表单构建器的任何示例。
任何指针/链接将不胜感激。
我正在寻找一个示例,说明如何为绑定到acts_as_tree 的对象的单选按钮列表创建自定义表单构建器。我已经有了显示单选按钮列表的代码,但想通过重构为表单生成器来干掉它。我找不到单选按钮列表的自定义表单构建器的任何示例。
任何指针/链接将不胜感激。
假设您经常从许多不同的视图调用此模型上的 form_for,并且每个表单都将具有相同的单选按钮集。您可以在这里选择几条路线。但是,我不知道您是在问如何自动添加单选按钮列表还是只是压缩它。
自动添加单选按钮列表需要的 ActionView 内部知识比我能分享的要多。本质上,您需要弄清楚事物是如何呈现的,并覆盖 ActionView::Helpers::FormHelper 中的 fields_for 方法以使其正常工作。不幸的是,FormBuilders 不是这样工作的。所以这将是比它的价值更多的麻烦。
更好的方法是创建一个方法,在自定义表单构建器中生成所有单选按钮。为了在发生更改时保持简单,我们将向模型添加一个常量。我任意决定它将是一个散列,其中每个键是您要在表单中用单选按钮列表表示的属性方法,每个值都是该属性的可接受值的列表。这使得生成多个单选按钮列表变得简单,而无需更改表单构建器。PS您还可以使用哈希来验证与单选按钮关联的任何属性的内容。
/app/models/example.rb
class Example < ActiveRecord::Base
...
RADIO_BUTTON_HASH = {
:attribute_a => [:accepted_value_a1, :accepted_value_a2, :accepted_value_a3],
:attribute_b => [:accepted_value_b1, :accepted_value_b2],
...
}
def self.radio_buttons_sort(a,b)
# sort method to ensure that multiple radio buttons lists appear in the order you want
end
def self.radio_buttons_sorted
RADIO_BUTTON_HASH.sort{|a,b| radio_button_sort(a,b)}
end
...
end
除了散列之外,我还添加了一些方便的方法,它们不是必需的,但它们提供了一种更简洁的标准化输出方法。
**/app/helpers/example_helper.rb 模块 ExampleHelper
# the custom FormBuilder
class ExampleFormBuilder < ActionView::Helpers::FormBuilder
# add onkeypress and set maxlength of field to 3 to all text fields
def radio_button_list(options={})
Example.sorted_radio_buttons.each do |method,values|
values.each do |value|
radio_button(method, value, options)
end
end
end
end
end
然后从包含 ExampleHelper 的视图(默认情况下在由 Example 控制器呈现的任何视图中完成)。
<%form_for @example, :builder => ExampleFormBuilder do |f| %>
...
<%=f.radio_button_list %>
<%end%>