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 %>
Он достиг результата, но является ли это безопасным способом достичь того, чего я хотел?