将text_field值传递给will_paginate作为Rails中的参数

时间:2015-01-02 20:08:46

标签: javascript jquery ruby-on-rails ajax

我有图书的控制器,在索引操作中我正在使用 will_paginate 。我还有标题作者的过滤器。

每次标题作者更改时,我都会进行ajax调用以获取@books的更新版本。

在我的index.js.erb文件中,我有我的代码来呈现视图:

$('#book_list').html("<%= escape_javascript( render('show_books') ).html_safe %>");

我的索引文件如下所示:

<%= will_paginate @books %>
<ol class="list-unstyled" id="book_list">
  <%= render 'show_books' %>
</ol>
<%= will_paginate @books %>

问题是,在AJAX调用后,will_paginate将不会更新。默认情况下我有45本书(每页30本书,共2页),在AJAX通话后我得到了9本书。它应该只显示1页,但它仍然显示2页。

如果我将will_paginate放在 book_list 中,它就会消失。如果我留在外面就不会更新。

另一个选择是,我可以将自定义参数传递给will_paginate,但我不知道如何在视图中获取文本字段的值并将其作为参数传递给{{1}没有提交。

这些是过滤书籍的输入表格:

will_paginate

1 个答案:

答案 0 :(得分:1)

我试图找到一种方法来动态更改will_paginate生成的页面链接以包含来自用户的信息,我在此处看到了您的帖子Rails3: How to pass param into custom will_paginate renderer?

在我的情况下,用户可以选择一个图表来显示will_paginate显示的数据,但默认的页面链接不会传递任何额外的参数,因此他们选择的图表不会保存在页面之间。

我的解决方案是覆盖链接,在每个链接中包含一个自定义类,然后我可以在页面目标上使用javascript并调整其属性。

这是我的覆盖代码

module Pageoverride
  class PaginationListLinkRenderer < WillPaginate::ActionView::LinkRenderer
    protected
      def link(text, target, attributes = {})
        if target.is_a? Fixnum
          attributes[:rel] = rel_value(target)
          target = url(target)
        end
        attributes[:href] = target
        attributes[:class] = 'chartpagetest'
        tag(:a, text, attributes)
      end
  end
end

我做的唯一改变是在属性数组中添加一个:class键,并使用我的自定义类标识符的值

我在will_paginate调用中包含自定义渲染器

<%= will_paginate(@dbtests, :renderer => Pageoverride::PaginationListLinkRenderer) %>

我的Javascript定位与我的类匹配的元素,我从变量“chart_id”广告中获取当前数据,并将其附加到每个元素的“href”属性的末尾。

for (index = 0; index<document.getElementsByClassName("chartpagetest").length;++index) {
                document.getElementsByClassName("chartpagetest")[index].setAttribute('href',document.getElementsByClassName("chartpagetest")[index].getAttribute('href') + "&chart="+chart_id);
            }

在您的情况下,您可以在链接中添加“隐藏”属性和类(属性[:hidden] ='false'),如果页面不再存在,则将其设置为“true”存在。