我正在尝试将表单插入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
的内容,则按预期工作。但是一旦我插入多个输入,它就被解释为文本。我在这里做错了什么?
答案 0 :(得分:1)
我不确定我是否完全理解这个问题,但这里有一些我注意到的事情。
首先,您不需要将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
我没有对此进行过测试,因此我不确定它是否可行,但我认为这是您需要做的一般要点。
答案 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字符串。
我希望这会有所帮助。