【问题标题】:Example of a rails custom formbuilder for a radiobutton list用于单选按钮列表的 Rails 自定义表单构建器示例
【发布时间】:2009-10-18 18:26:43
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails radiobuttonlist formbuilder


    【解决方案1】:

    假设您经常从许多不同的视图调用此模型上的 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 的视图中(默认情况下在由 Example 控制器呈现的任何视图中完成)。

    <%form_for @example, :builder => ExampleFormBuilder do |f| %>
      ...
    
      <%=f.radio_button_list %>
    <%end%>
    

    【讨论】:

    • 感谢您的回复。昨晚我花了几个小时尝试通过 rails helpers 来解决这个问题,最终得到了一个类似的解决方案。
    • 是的,官方文档在这个问题上不是很有帮助。简短的版本是您使用自定义 FormBuilders 来使用您的选项覆盖 FormHelper 方法,或者创建新的辅助方法。
    猜你喜欢
    • 2014-08-19
    • 2016-10-03
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2014-02-16
    相关资源
    最近更新 更多