Невозможно отобразить несколько входов внутри тега формы, используя TagHelper
Я пытаюсь вставить форму в will_paginate
Таким образом, пользователь может ввести номер страницы и нажать Enter, чтобы перейти на эту страницу.
Для этого я передаю params
из запроса в will_paginate
и добавив их в качестве скрытых входов в форму. Таким образом, все эти значения будут добавлены в URL вместе с номером страницы (единственный видимый вход) при отправке формы.
Проблема в том, что мои входные данные интерпретируются как текст их родительского узла, а не дочерних узлов html. Вот to_html
метод:
def to_html
inputs = [@template.tag(:input, :name => 'page', :value => current_page, :size => 1)]
@options[:params].delete(:page)
@options[:params].delete(:action)
@options[:params].each do |k, v|
inputs << @template.tag(:input, :type => 'hidden', :name => k, :value => v)
end
html = inputs.join
form = @template.content_tag(:form, @template.content_tag(:div, html))
previous_page + form + next_page
end
И вот форма, как она появляется на странице:
<form>
<div><input name="page" size="1" value="1" /><input name="utf8" type="hidden" value="✓" /><input name="full_query" type="hidden" value="{"name"=>"", "organization_name"=>"", "contact_type_id"=>""}" /><input name="commit" type="hidden" value="Generate List" /><input name="controller" type="hidden" value="contacts/contacts" /></div>
</form>
Если бы я только положил inputs.first
как содержание div
работает как положено. Но как только я вставляю несколько входов, это интерпретируется как текст. Что я здесь не так делаю?
2 ответа
Ты захочешь сделать
html = inputs.join.html_safe
Теперь к интересной части: почему inputs.first
работать, но inputs.join
не делает? Что ж, inputs.first
на самом деле вывод @template.tag(...)
, который возвращает строку html_safe. Но когда вы выполняете Ruby-соединение для нескольких строк html_safe, вы получаете строку, отличную от html_safe.
Другими словами, с content_tag(:div, inputs.first)
, inputs.first
является строкой html_safe; с content_tag(:div, inputs.join)
, inputs.join
не является строкой html_safe.
Надеюсь, это поможет.
Я не уверен, что полностью понимаю проблему, но вот несколько вещей, которые я заметил.
Во-первых, вам не нужно передавать все значения в params
от запроса в виде скрытых значений до формы. Вы удалили page
а также action
, но оставил controller
(который появляется как последний скрытый ввод в сгенерированной форме).
Но, что более важно, я не думаю, что вам нужно удалять их из params
а затем перебирая все, что осталось. То, что вы хотите, это предыдущие входные значения формы, которые, кажется, хранятся в params[:full_query]
(Я предполагаю, что ваша форма для объекта с именем full_query
?), так почему бы вам просто не повторить это? Тогда вам не нужно беспокоиться о delete(:page)
, delete(:action)
и т.д. Назначьте значения full_query[<KEY>]
т.е. full_query[name]
, full_query[organization_name]
, так далее.
Как это:
def to_html
inputs = [@template.tag(:input, :name => 'page', :value => current_page, :size => 1)]
@options[:params][:full_query].each do |k, v|
inputs << @template.tag(:input, :type => 'hidden', :name => "full_query[#{k}]", :value => v)
end
html = inputs.join
form = @template.content_tag(:form, @template.content_tag(:div, html))
previous_page + form + next_page
end
Я не проверял это, поэтому я не уверен, что это сработает, но я думаю, что это общая суть того, что вам нужно сделать.