0

我正在寻找一个示例,说明如何为绑定到acts_as_tree 的对象的单选按钮列表创建自定义表单构建器。我已经有了显示单选按钮列表的代码,但想通过重构为表单生成器来干掉它。我找不到单选按钮列表的自定义表单构建器的任何示例。

任何指针/链接将不胜感激。

4

1 回答 1

2

假设您经常从许多不同的视图调用此模型上的 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%>
于 2009-10-19T05:06:45.897 回答