Rails неверное количество аргументов (0 для 1..3) в пользовательском FormBuiler

Я пишу пользовательский FormBuilder в Rails, и я получаю вышеупомянутую ошибку в "около строки 14" (<%= f.text_field :name, autofocus: true %>) зрения.

Мой FormBuilder:

class FoundationFormBuilder < ActionView::Helpers::FormBuilder
    delegate :content_tag, to: :@template
    delegate :label_tag, to: :@template

    def text_field(method, options = {})
        options[:label] ||= "#{method.to_s}".humanize
        options[:class] ||= ""
        field_errors = object.errors[method].join(', ') unless object.errors[method].blank?
        error_class = "error" if field_errors
        error_class ||= ""

        label_tag("#{@object_name}[#{method}]", "#{options[:label]}", class: error_class) do
            label << @template.send(text_field_tag("#{@object_name}[#{method}]", nil, class: "error_class #{options[:class]}"))
            # label << (content_tag(:small, field_errors.humanize, class: error_class)) if field_errors

            label.html_safe
        end
    end
end

По-моему:

<%= form_for(@message, url: contact_us_path, builder: FoundationFormBuilder) do |f| %>
    <!--<%= f.label :name %>-->
    <%= f.text_field :name, autofocus: true %>

    <!--<%= f.label :email %>
    <%= f.text_field :email %>

    <%= f.label :comment %>
    <%= f.text_area :comment, rows: 10 %>

    <%= f.submit "Send", class: "button round right" %>-->
<% end %>

Вот трассировка приложения:

app/helpers/foundation_form_builder.rb:13:in `block in text_field'
app/helpers/foundation_form_builder.rb:3:in `label_tag'
app/helpers/foundation_form_builder.rb:12:in `text_field'
app/views/contact_us/new.html.erb:14:in `block in _app_views_contact_us_new_html_erb___968573049544088412_70132699754860'
app/views/contact_us/new.html.erb:12:in `_app_views_contact_us_new_html_erb___968573049544088412_70132699754860'

Насколько я могу судить, я передаю аргументы label_tag так как я предполагаю, что это является причиной ошибки. Что я на самом деле делаю не так?

Обновить:

Я думаю, что это связано с методом beign, переданным как text_field метке, но я не уверен. Все еще чешу голову.

1 ответ

Проблема пыталась добавить ярлык, когда я не инициализировал его ранее.

То, чего я хотел достичь, было следующее:

<form>
    <div class="row">
        <div class="large-6 columns">
            <label class="error">Error
                <input type="text" class="error" />
            </label>
            <small class="error">Invalid entry</small>
        </div>
        <div class="large-6 columns error">
            <label>Another Error
                <input type="text" />
            </label>
            <small class="error">Invalid entry</small>
        </div>
    </div>
    <textarea class="error" placeholder="Message..."></textarea>
    <small class="error">Invalid entry</small>
</form>

Как видно здесь Zurb - Foundation 5 Forms

Что было сделано следующим образом:

FormBuilder:

class FoundationFormBuilder < ActionView::Helpers::FormBuilder
    delegate :content_tag, to: :@template
    delegate :label_tag, to: :@template

    def text_field(method, options = {})
        options[:label] ||= "#{method.to_s}".humanize
        options[:class] ||= ""
        field_errors = object.errors[method].join(', ') unless object.errors[method].blank?
        options[:class] << "error" if field_errors
        options = objectify_options(options)
        options.delete(:object)

        label = lambda do
            label_tag("#{@object_name}[#{method}]", "#{options[:label]}", class: "#{'error' if field_errors}") do
                label = "#{options[:label]}"
                label << @template.send('text_field_tag', "#{@object_name}[#{method}]", nil, options)

                label.html_safe
            end
        end

        error_messages = lambda do
            content_tag(:small, field_errors.humanize, class: "error") if field_errors
        end

        "#{label.call} #{error_messages.call}".html_safe
    end

    def text_area(method, options = {})
        options[:label] ||= "#{method.to_s}".humanize
        options[:class] ||= ""
        field_errors = object.errors[method].join(', ') unless object.errors[method].blank?
        options[:class] << "error" if field_errors
        options = objectify_options(options)
        options.delete(:object)

        label = lambda do
            label_tag("#{@object_name}[#{method}]", "#{options[:label]}", class: "#{'error' if field_errors}") do
                label = "#{options[:label]}"
                label << @template.send('text_area_tag', "#{@object_name}[#{method}]", nil, options)

                label.html_safe
            end
        end

        error_messages = lambda do
            content_tag(:small, field_errors.humanize, class: "error") if field_errors
        end

        "#{label.call} #{error_messages.call}".html_safe
    end
end

Посмотреть:

<%= form_for(@message, url: contact_us_path, builder: FoundationFormBuilder) do |f| %>
    <%= f.text_field :name %>
    <%= f.text_field :email %>
    <%= f.text_area :comment, rows: 10 %>
    <%= f.submit "Send", class: "button round right" %>
<% end %>

Он достиг результата, но является ли это безопасным способом достичь того, чего я хотел?

Другие вопросы по тегам