1

我正在尝试插入一个表单,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,它会按预期工作。但是一旦我插入多个输入,它就会被解释为文本。我在这里做错了什么?

4

2 回答 2

1

你会想做

html = inputs.join.html_safe

现在到了有趣的部分:为什么inputs.first有效,但inputs.join无效?嗯,inputs.first实际上是 的输出@template.tag(...),它返回一个 html_safe 字符串。但是,当您对多个 html_safe 字符串执行 Ruby 连接时,您会得到一个非 html_safe 字符串。

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

我希望这有帮助。

于 2012-08-24T04:17:08.897 回答
1

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

首先,您不需要params将请求中的所有值作为隐藏值传递给表单。您已删除pageand 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

我没有对此进行测试,所以我不确定它是否会起作用,但我认为这是您需要做的一般要点。

于 2012-08-24T04:10:28.790 回答