无法使用TagHelper在表单标记内呈现多个输入

时间:2012-08-24 03:00:44

标签: ruby-on-rails-3 forms will-paginate hidden-field

我正在尝试将表单插入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 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解这个问题,但这里有一些我注意到的事情。

首先,您不需要将params中的所有值作为隐藏值传递给表单。您已移除pageaction,但离开了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

我没有对此进行过测试,因此我不确定它是否可行,但我认为这是您需要做的一般要点。

答案 1 :(得分:1)

你想要做

html = inputs.join.html_safe

现在谈到有趣的部分:为什么inputs.first有效,但inputs.join没有?好吧,inputs.first实际上是@template.tag(...)的输出,returns an html_safe string。但是,当你在多个html_safe字符串上进行Ruby连接时,会得到一个非html_safe字符串。

换句话说,使用content_tag(:div, inputs.first)inputs.first是一个html_safe字符串;使用content_tag(:div, inputs.join)inputs.join不是html_safe字符串。

我希望这会有所帮助。