首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails: Filterrific不更新作用域。新作用域不会在视图中加载

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

Stack Overflow用户
提问于 2017-07-09 20:45:13
回答 1查看 475关注 0票数 0

我正在尝试使用filter在我的索引页面上创建一个基本的过滤器。不幸的是,talking似乎并没有和我的数据库对话。当我运行服务器并使用下拉菜单进行sort_by时,将呈现新的部分,但范围不会更改。

代码语言:javascript
复制
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也不影响显示的作用域。

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

这是我的模型

代码语言:javascript
复制
 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

我的控制器

代码语言:javascript
复制
...

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

我的观点

视图/wikis/index.html.erb

代码语言:javascript
复制
<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>

视图/wikis/_list.html.erb

代码语言:javascript
复制
<div id="filterrific_results">
  <% wikis.each do |wiki| %>
    <h4>
      <%= link_to wiki.title, wiki %>
      (<%= wiki.year %>)
    </h4>
  <% end %>
</div>

视图/wikis/index.js.erb

代码语言:javascript
复制
<% js = escape_javascript(
  render(partial: 'wikis/list', locals: { wikis: @wikis })
) %>
$("#filterrific_results").html("<%= js %>");

我还在application.js中包含了application.js

一定有什么东西是我错过的,把它联系在一起,但我对它可能是什么感到茫然。我最初使用sqlight3作为我的数据库,并认为这就是问题所在,因此我已经更改为mysql2,因为它被列为文件文档中支持的内容。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-09 22:06:57

最后,我发现了我的错误。

在控制器中,当我应该将@wikis = Wiki.all定义为@wikis = @filterrific.find时,我仍然在定义它。这样,filterrifc执行的搜索将存储在@wikis变量中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45000865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档