Да, вы можете добавить класс 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 - объект модели, указанный в форме
- @ имя_объекта - имя класса объекта
- @ template - я думаю, что это экземпляр ActionView, вы можете обойти все добавления, которые я добавил, вызывая методы в шаблоне. Еще не пробовал.
- @ options - опции, передаваемые FormBuilder при его создании вызовом form_for
Я написал методы field_id и field_name для создания этих атрибутов в элементах ввода HTML так же, как это делают обычные помощники, я уверен, что есть способ привязать к тем же методам, которые использует Rails, но я этого не сделал нашел еще.
Небо - это предел того, что вы можете сделать с помощью этих вспомогательных методов, они просто возвращают строки. Вы можете создавать целые HTML-таблицы или страницы в одной, но вам лучше иметь веские причины для этого.
Этот файл должен быть добавлен в папку app / helpers