2014-10-19 76 views
0

我想通过ajax调用更新索引页。我遇到的唯一问题是返回的will_paginate链接具有url的.js扩展名。渲染will_paginate链接,如果通过html请求,当通过ajax请求时

这是我的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?与/用户?,但它似乎应该有一个不那么“黑客”的方式来做到这一点。

任何想法?

回答

0

我有一个类似但不完全相同的问题,我用自定义渲染器解决了这个问题。这是一个少hacky,但不幸的是我需要添加的代码是在超级方法的中间,所以没有简单的方法来使用“超级”。此代码位于app/helpers/pagination_helper.rb中。它会使用原始副本覆盖呈现器的链接方法,并在中间插入一些新代码,因此请注意,它易受到修订will_paginate代码自身引入的错误的影响。

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 %>