Пользовательские помощники формы

Есть ли способ, которым я могу создать пользовательского помощника формы так, чтобы вместо:

special_field_tag :object, :method

Я могу достигнуть чего-то как:

form.special_field :method
24
задан 12 April 2010 в 15:33
поделиться

1 ответ

Да, вы можете добавить его в класс FormBuilder и получить доступ к объекту, переданному в form_for. Я сделал это для многих вещей: дат, времени, измерений и т. Д. Вот пример:

class ActionView::Helpers::FormBuilder
  include ActionView::Helpers::TagHelper
  include ActionView::Helpers::FormTagHelper
  include ActionView::Helpers::FormOptionsHelper
  include ActionView::Helpers::CaptureHelper
  include ActionView::Helpers::AssetTagHelper

  # Accepts an int and displays a smiley based on >, <, or = 0
  def smile_tag(method, options = {})
    value = @object.nil? ? 0 : @object.send(method).to_i
    options[:id] = field_id(method,options[:index])
    smiley = ":-|"
    if value > 0
      smiley = ":-)"
    elsif smiley < 0
       smiley = ":-("
    end
    return text_field_tag(field_name(method,options[:index]),options) + smiley
  end

  def field_name(label,index=nil)
    output = index ? "[#{index}]" : ''
    return @object_name + output + "[#{label}]"
  end

  def field_id(label,index=nil)
    output = index ? "_#{index}" : ''
    return @object_name + output + "_#{label}"
  end

end

Что вы можете использовать следующим образом:

<% form_for @quiz do |f| %>
  <%= f.smile_tag(:score) %>
<% end %>

Есть некоторые переменные экземпляра, созданные Rails, к которым вы можете получить доступ в этих вспомогательные методы:

  • @object - объект модели, указанный в форме
  • @object_name - имя класса объекта
  • @template - я думаю, что это экземпляр ActionView, вы можете обойти все включения Я добавил, вызывая методы в шаблоне. Еще не пробовал.
  • @options - параметры, передаваемые в FormBuilder при его создании с помощью вызова form_for

Я написал методы field_id и field_name для создания этих атрибутов в элементах ввода HTML так же, как это делают обычные помощники, я уверен, что есть это способ использовать те же методы, что и в Rails, но я его еще не нашел.

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

Этот файл нужно добавить в папку app / helpers

48
ответ дан 28 November 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: