我正在寻找一个例子,如何创建一个自定义表单生成器的单选按钮列表绑定到一个对象,acts_as_tree。我已经有了显示单选按钮列表的代码,但是我想通过重构到一个表单生成器来使它干掉。我找不到任何用于单选按钮列表的自定义表单生成器的示例。
任何指针/链接都将不胜感激。
发布于 2009-10-19 05:06:46
假设您经常从许多不同的视图对此模型调用form_for,并且每个表单都将具有相同的单选按钮集。这里有几条你可以走的路线。然而,我不知道你是在问如何自动添加单选按钮列表,还是只是压缩它。
自动添加单选按钮列表所需的ActionView内部知识比我所能分享的要多一点。本质上,您需要弄清楚事物是如何呈现的,并覆盖ActionView::Helpers::FormHelper中的fields_for方法才能正常工作。不幸的是,FormBuilders不是这样工作的。所以这会带来很多麻烦,而不是它的价值。
更好的方法是创建一个在自定义表单生成器中生成所有单选按钮的方法。为了在发生变化时保持简单,我们将在模型中添加一个常量。我随意地决定它将是一个散列,其中每个键都是一个属性方法,您希望在表单中使用单选按钮列表来表示,并且每个值都是该属性的可接受值的列表。这使得无需更改表单构建器即可轻松生成多个单选按钮列表。附注:您还可以使用散列来验证与单选按钮关联的任何属性的内容。
/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的视图(默认情况下,在示例控制器呈现的任何视图中执行)。
<%form_for @example, :builder => ExampleFormBuilder do |f| %>
...
<%=f.radio_button_list %>
<%end%>https://stackoverflow.com/questions/1585648
复制相似问题