【问题标题】:How to disable Turbolinks for will_paginate? (Rails 7)如何为 will_paginate 禁用 Turbolinks? (轨道 7)
【发布时间】:2022-09-30 13:02:43
【问题描述】:

需要为分页按钮禁用 Turbolinks。

简单地添加data: { turbo: false } 似乎不起作用。

<% will_paginate data: { turbo: false } %>

    标签: turbolinks will-paginate disable ruby-on-rails-7


    【解决方案1】:

    &lt;% will_paginate data: { turbo: false } %&gt; 不起作用的原因是它将data-turbo 属性放在外部容器 div 上,而不是放在单个按钮链接上。

    虽然还没有为will_paginate 分页链接禁用turbolinks 的快捷方式(至少我找不到任何),但可以通过如下自定义will_paginate 渲染器来实现所需的结果。


    首先,创建自定义渲染器:config/initializers/custom_paginate_renderer.rb。注意li 标签上的data-turbo="false" 属性。这会成功的。

    require 'will_paginate/view_helpers/action_view'
    require 'will_paginate/view_helpers/link_renderer' 
    
    class CustomPaginateRenderer < WillPaginate::ActionView::LinkRenderer
      def container_attributes
        { class: 'pagination' }
      end
    
      def html_container(html)
        child = tag(:ul, html, container_attributes)
        tag(:nav, child)
      end
    
      def page_number(page)
        if page == current_page
          '<li class="page-item active" data-turbo="false">' + link(page, page, rel: rel_value(page),class: 'page-link') + '</li>'
        else
          '<li class="page-item" data-turbo="false">' + link(page, page, rel: rel_value(page),class: 'page-link') + '</li>'
        end
      end
    
      def previous_page
        num = @collection.current_page > 1 && @collection.current_page - 1
      previous_or_next_page(num, '<span aria-hidden="true">&laquo;</span>')
      end
    
      def next_page
        num = @collection.current_page < total_pages && @collection.current_page + 1
      previous_or_next_page(num, '<span aria-hidden="true">&raquo;</span>')
      end
    
      def previous_or_next_page(page, text)
        if page
          '<li class="page-item" data-turbo="false">' + link(text, page, class: 'page-link') + '</li>'
        else
          '<li class="page-item disabled" data-turbo="false">' + link(text, page, class: 'page-link') + '</li>'
        end
      end
    end
    

    接下来,将其作为will_paginate 的渲染器传递:app/helpers/application_helper.rb

    def will_paginate(coll_or_options = nil, options = {})
      if coll_or_options.is_a? Hash
        options = coll_or_options
        coll_or_options = nil
      end
      unless options[:renderer]
        options = options.merge renderer: CustomPaginateRenderer
      end
      super *[coll_or_options, options].compact
    end
    

    最后,不要忘记重新启动服务器以使配置更改生效。


    如果其他人知道更好的方法,我会很高兴听到它!


    参考:

    https://github.com/mislav/will_paginate/wiki/Link-renderer

    custom will_paginate renderer

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2017-05-11
      • 2020-04-05
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多