Невозможно отобразить несколько входов внутри тега формы, используя 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="{&quot;name&quot;=&gt;&quot;&quot;, &quot;organization_name&quot;=&gt;&quot;&quot;, &quot;contact_type_id&quot;=&gt;&quot;&quot;}" /><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

Я не проверял это, поэтому я не уверен, что это сработает, но я думаю, что это общая суть того, что вам нужно сделать.

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