代码之家  ›  专栏  ›  技术社区  ›  Scott Wendell Livingstone

Rails:Filterrific不更新作用域。视图中不会加载新范围

  •  0
  • Scott Wendell Livingstone  · 技术社区  · 8 年前

    sort_by 呈现新的分部,但范围不变。

    Started GET "/wikis?utf8=%E2%9C%93&filterrific%5Bsearch_query%5D=&filterrific%5Bsorted_by%5D=title_asc&_=1499629014459" for 127.0.0.1 at 2017-07-09 12:48:29 -0700
    Processing by WikisController#index as JS
      Parameters: {"utf8"=>"✓", "filterrific"=>{"search_query"=>"", "sorted_by"=>"title_asc"}, "_"=>"1499629014459"}
      Wiki Load (0.5ms)  SELECT `wikis`.* FROM `wikis`
      Rendered wikis/_list.html.erb (4.2ms)
      Rendered wikis/index.js.erb (5.1ms)
    Completed 200 OK in 8ms (Views: 6.9ms | ActiveRecord: 0.5ms)
    

    同时 default_filter_params

    我定义的范围在控制台中工作得很好,所以我确信它们是正确的。

    这是我的模型

     class Wiki < ActiveRecord::Base
      belongs_to :user
      has_many :collaborators
      validates :body, presence: true
      validates :title,
        presence: true,
        uniqueness: { case_sensitve: false, scope: [:year]},
        length: { minimum: 3, maximum: 254}
    
      enum category: [:adventure, :dual_sport, :sport, :naked,
        :touring, :cruiser, :custom, :dirt, :roadster]
    
      enum final_drive: [:belt, :chain, :shaft]
    
      filterrific(
        default_filter_params: { sorted_by: 'title_asc'},
        available_filters: [
          :sorted_by,
          :search_query
        ]
      )
    
      scope :search_query, lambda { |query|
        return nil  if query.blank?
    
        terms = query.downcase.split(/\s+/)
    
        terms = terms.map { |e|
          (e.gsub('*', '%') + '%').gsub(/%+/, '%')
        }
        num_or_conds = 2
        where(
          terms.map { |term|
            "(LOWER(students.first_name) LIKE ? OR LOWER(students.last_name) LIKE ?)"
          }.join(' AND '),
          *terms.map { |e| [e] * num_or_conds }.flatten
        )
      }
    
      scope :sorted_by, lambda { |sort_option|
        direction = (sort_option =~ /desc$/) ? 'desc' : 'asc'
        case sort_option.to_s
        when /^title_/
          order("wikis.title #{ direction }")
        when /^cylinders_/
          order("wikis.cylinders #{ direction }")
        when /^hp_/
          order("wikis.hp #{ direction }")
        when /^torque_/
          order("wikis.torque #{ direction }")
        when /^displacement_/
          order("wikis.displacement #{ direction }")
        when /^year_/
          order("wikis.year #{ direction }")
        else
          raise(ArgumentError, "Invalid sort option: #{ sort_option.inspect }")
        end
      }
    
      def self.options_for_sorted_by
        [
          ['Title (a-z)', 'title_asc'],
          ['HP (most)', 'hp_desc'],
          ['HP (least)', 'hp_asc'],
          ['Torque (most)', 'torque_desc'],
          ['Torque (least)', 'torque_asc'],
          ['Year (oldest)', 'year_desc'],
          ['Year (newest)', 'year_asc'],
          ['Displacement (most)', 'displacement_desc'],
          ['Displacement (least)', 'displacement_asc'],
          ['Cylinders (most)', 'cylinders_desc'],
          ['Cylinders (least)', 'cylinders_asc'],
        ]
      end
    end
    

    我的控制器

    ...
    
    def index
        @wikis = Wiki.all
        @filterrific = initialize_filterrific(
          Wiki,
          params[:filterrific],
          select_options: {
            sorted_by: Wiki.options_for_sorted_by,
          },
          available_filters: [:sorted_by]
        ) or return
    
        respond_to do |format|
          format.html
          format.js
        end
        rescue ActiveRecord::RecordNotFound => e
          puts "Had to reset filterrific params: #{ e.message }"
          redirect_to(reset_filterrific_url(format: :html)) and return
      end
    ...
    

    我的观点

    视图/wiki/index.html.erb

    <div class="container">
      <div class="row">
        <div class="col-sm-8">
          <div>
            <%= form_for_filterrific @filterrific do |f| %>
            <div>
              Search
              <%= f.text_field(
                :search_query,
                class: 'filterrific-periodically-observed'
              ) %>
            </div>
            <div>
              Sorted by
              <%= f.select(:sorted_by, @filterrific.select_options[:sorted_by]) %>
            </div>
            <div>
              <%= link_to(
                'Reset filters',
                reset_filterrific_url,
              ) %>
            </div>
            <%= render_filterrific_spinner %>
            <% end %>
    
            <div>
              <%= render(
                partial: 'wikis/list',
                locals: { wikis: @wikis }
              ) %>
            </div>
          </div>
        </div>
      </div>
    </div>
    

    视图/wiki/u list.html.erb

    <div id="filterrific_results">
      <% wikis.each do |wiki| %>
        <h4>
          <%= link_to wiki.title, wiki %>
          (<%= wiki.year %>)
        </h4>
      <% end %>
    </div>
    

    views/wiki/index.js.erb

    <% js = escape_javascript(
      render(partial: 'wikis/list', locals: { wikis: @wikis })
    ) %>
    $("#filterrific_results").html("<%= js %>");
    

    //= require filterrific/filterrific-jquery 在application.js中

    一定有什么我错过了把它联系在一起,但我对它可能是什么感到困惑。我最初使用sqlight3作为我的数据库,并认为这是问题所在,因此我改为mysql2,因为它在filterrific文档中被列为受支持。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Scott Wendell Livingstone    8 年前

    在控制器中,我仍在定义 @wikis = Wiki.all 当我把它定义为 @wikis = @filterrific.find 。这样,FilterRigf执行的搜索将存储在 @wikis