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

問題を完全に理解できるかどうかはわかりませんが、気付いたことがいくつかあります。

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

私はこれをテストしていないので、うまくいくかどうかはわかりませんが、これがあなたがしなければならないことの一般的な要点だと思います。

于 2012-08-24T04:10:28.790 に答える
1

あなたはしたいと思うでしょう

html = inputs.join.html_safe

ここで興味深い部分に移ります。なぜ機能するのinputs.firstに機能inputs.joinしないのでしょうか。ええと、inputs.first実際にはの出力であり、html_safe文字列@template.tag(...)を返します。ただし、複数のhtml_safe文字列に対してRuby結合を実行すると、非html_safe文字列が取得されます。

つまりcontent_tag(:div, inputs.first)、、inputs.firstはhtml_safe文字列です。、はhtml_safe文字列ではありませんcontent_tag(:div, inputs.join)inputs.join

これがお役に立てば幸いです。

于 2012-08-24T04:17:08.897 に答える