当通过ajax请求时,渲染will_paginate链接,就像通过html请求一样

时间:2014-10-19 22:21:34

标签: ruby-on-rails will-paginate

我正在尝试通过ajax调用更新索引页面。我遇到的唯一问题是返回的will_paginate链接的URL扩展名为.js。

这是我提出请求的coffeescript。

  onSearchBoxChanged : () ->
    console.log "search box changed"
    console.log @view.getSearchBoxContents()
    jQuery.getScript('/users.js?search=' + @view.getSearchBoxContents() ) 

在用户控制器中,我会回复html和javascript。

 respond_to :html, :js

我也有一部分用于will_paginate链接(在_paginate.html.erb文件中)

<%= will_paginate %>

这是我的index.js.coffee文件

console.log "back from server "
console.log '<%= escape_javascript(render(@users)) %>'
userList = '<%= escape_javascript(render(@users)) %>'
console.log '<%= escape_javascript(render("paginate")) %>'
paginate =  '<%= escape_javascript(render("paginate")) %>'
jQuery.publish('new_user_list_from_server', [ userList, paginate ] )

以下是控制台中打印的链接

<div class="pagination"><ul><li class="prev previous_page disabled"><a href="#">&#8592; Previous</a></li> <li class="active"><a rel="start" href="/users.js?_=1413756082270&amp;page=1&amp;search=j">1</a></li> <li><a rel="next" href="/users.js?_=1413756082270&amp;page=2&amp;search=j">2</a></li> <li class="next next_page "><a rel="next" href="/users.js?_=1413756082270&amp;page=2&amp;search=j">Next &#8594;</a></li></ul></div> 

我可以替换所有的/users.js?与/ users?,但似乎应该有一个不那么“hacky”的方式来做到这一点。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我有一个类似但不完全相同的问题,我用自定义渲染器解决了这个问题。它不那么简单,但遗憾的是我需要添加的代码是在超级方法的中间,所以没有简单的方法可以使用&#34; super&#34;。此代码位于app / helpers / pagination_helper.rb中。它使用原始副本覆盖渲染器的链接方法,并在中间插入一些新代码,因此请注意它很容易受到对will_paginate代码本身的修订引入的错误的攻击。<​​/ p>

module PaginationHelper
  class Renderer < WillPaginate::ActionView::LinkRenderer
    protected
    def link(text, target, attributes = {})
      if target.is_a? Fixnum
        attributes[:rel] = rel_value(target)
        target = url(target)
      end

      # New code here:
      if @options[:path].present?
        parts = target.split "?"
        parts.shift
        parts.unshift @options[:path]
        target = parts.join "?"
      end
      # End of new code

      attributes[:href] = target
      tag(:a, text, attributes)
    end
  end
end

然后在视图中指定自定义渲染器并覆盖路径:

<%= will_paginate @my_models, path: my_models_path, renderer: PaginationHelper::Renderer %>