Rails过滤器使用按钮或link_to使用Ransack

时间:2017-07-18 22:47:18

标签: ruby-on-rails ajax ransack

我正在使用Ransack gem开发一个rails应用程序,下面是我编写的代码,用于过滤我的数据库,它就像一个魅力。现在我要做的是在索引视图中添加其他按钮(如过滤器选项)(其中每个按钮都有预定义的过滤器值)。换句话说,一旦首先使用品牌名称过滤数据库,我希望用户能够通过单击其中一个具有预定义过滤值的按钮来进一步过滤数据库。白色',然后rails将显示所选品牌名称和白色的所有数据)。

控制器

class ProjectsController < ApplicationController

def index
@q = Project.ransack(params[:q])
@projects = @q.result(distinct: true)
@projects_count = @q.result.count
@projects = Kaminari.paginate_array(@projects).page(params[:page]).per(30)
end

索引视图

<%= search_form_for @q, remote: true, :builder => SimpleForm::FormBuilder  do |f| %>
<%= f.input :brand_id_eq, label: false, collection: Brand.all.map{ |f| [f.name, f.id] }, prompt: "All", input_html: { class: "form-control" } %>
<%= f.button :submit, label: "Search", input_html: { class: "btn btn-primary" } %>
<% end %>
...
<span class="data-sort all"><%= link_to "All",q: {color_cont: 'white'}, :class => 'link-sort', :remote => true, :method => :post %></span>

index.js.erb的

$('#projects').html('<%= escape_javascript (render partial: 'index') %>').hide().fadeIn('slow');

我使用Ransack gem的这种方法面临的问题是,当我点击link_to过滤器按钮时,它会使用预定义的过滤器值&#39;白色&#39;过滤数据库。但它会重置所有先前选择的过滤器选项。

除了使用link_to选项之外,我的方法是否正确或是否有更好的方法来实现这一目标?

我终于使用了rails的scope方法和一个简单的jQuery代码,如下面的最终代码所示。我最初做错的一件事是我将范围的名称设置为与我的db列名称之一相同,这导致了错误。一旦我将范围名称更改为&#39; status1&#39;,而不是&#39; stock_no&#39;,它就开始工作了。希望这会有所帮助。

定义范围

class ApplicationRecord < ActiveRecord::Base

scope :status1, -> { where( stock_no = "15251" ) }

def self.ransackable_scopes(auth_object = nil)
[:status1]
end

Index.erb

<%= f.hidden_field :status1 %>
<%= f.submit "Stock", :id => "status1", :onclick => "document.getElementById('q_status1').value = 1;", class: 'btn btn-primary status1' %>

2 个答案:

答案 0 :(得分:0)

试试这个question。这有点像你要做的,除了代替提交按钮,只需让你的按钮进行过滤。它需要在你的search_form_for里面,我也很确定。然后编写一个jquery函数,在单击按钮时提交,如:

$(document).on("turbolinks:load", function(){
    $(".data-sort").on('click', function() {
        $("form.your-search-form-classname").trigger('submit.rails');
    });
});

<强>更新

尝试从范围中删除(boolean = true)属性。我用我自己的类似应用进行了测试,效果很好。

更新2

我把以下内容放在我的应用程序中(状态是db中的一列,就像你的stock_no一样),并从我的数据库中获得了正确的查询:

<%= f.hidden_field :stock_no %>
<%= f.submit "Stock", :id => "stock_no", :onclick => "document.getElementById('q_stock_no').value = 1;", class: 'btn btn-primary stock_no' %>

scope :stock_no, -> { where( status: 2 ) }

def self.ransackable_scopes(auth_object = nil)
    [:stock_no]
end

您确定要将范围放在正确的模型中吗?

答案 1 :(得分:0)

替换

<%= link_to "All",q: {color_cont: 'white'}, :class => 'link-sort', :remote => true, :method => :post %>

<%= link_to "All",q: {color_cont: 'white', brand_id_eq: params[:q][:brand_id_eq]}, :class => 'link-sort', :remote => true, :method => :post %>

这里的假设是

  

数据库首先使用品牌名称进行过滤后,我希望用户能够通过点击其中一个按钮进一步过滤数据库,具有预定义的过滤值