Пользовательские элементы формы в Rails - PullRequest
2 голосов
/ 02 февраля 2010

Итак, я новичок в Rails и пытаюсь понять, каков канонический способ добавления пользовательских элементов формы. В настоящее время я делаю это просто супер.

module ActionView
  module Helpers
    module FormOptionsHelper
      def some_new_field(object, method, options = {}, html_options = {})
          #code code
      end
    end
    class FormBuilder 
      def contract_year_select(method, options = {}, html_options = {})
        @template.some_new_field(@object_name, method, objectify_options(options), @default_options.merge(html_options))
      end
    end
  end
end

Однако я видел это.

class Forms::ApplicationFormBuilder < ActionView::Helpers::FormBuilder
  Forms::ApplicationHelper.instance_methods.each do |selector|
    src = <<-end_src
      def #{selector}(method, options = {})
        @template.send(#{selector.inspect}, @object_name, method, objectify_options(options))
      end
    end_src
    class_eval src, __FILE__, __LINE__
  end

  private

  def objectify_options(options)
    @default_options.merge(options.merge(:object => @object))
  end
end

(из здесь )

Расширение FormBuilder кажется лучшим решением, чем утка, пробивающая его. Есть ли другой способ сделать это, который не требует прямого копирования частей класса FormBuilder в мой собственный?

1 Ответ

0 голосов
/ 30 декабря 2010

Здесь два партнера:

Во-первых, как новичок в рельсах, я бы порекомендовал использовать драгоценный камень Formtastic.V является злоупотребленной и забытой частью MVC в рельсах.

Formtastic очень хорошо протестирован и поддерживает Rails 3

https://github.com/justinfrench/formtastic

С помощью Formtastic вы можете создавать пользовательские элементы, расширяющие его блестящий класс, и получить целый набордругие преимущества помимо простого отображения поля.

Во-вторых, расширение класса определенно приемлемо.Я предпочитаю метод Module, так как на него проще смотреть.Как что-то вроде:

module Forms::ApplicationFormBuilder
 class WhateverYourExtending
  def some_special_method(stuff)
   # all kinds of special stuff here
  end
 end
end

Но я едва знаю, о чем я говорю здесь ... Этот материал прямо на краю моего понимания.

Просто видел, как вы разговариваетео формах и я люблю Formtastic!

...