Rails 使用按钮过滤或使用 Ransack link_to
Rails filter with button or link_to using Ransack
我正在使用 Ransack gem 开发一个 rails 应用程序,下面是我到目前为止编写的用于过滤我的数据库的代码,它非常有用。现在我要做的是向我的索引视图添加额外的按钮,如过滤器选项(每个按钮都有预定义的过滤器值)。换句话说,一旦数据库首先使用品牌名称进行过滤,那么我希望用户能够通过单击具有预定义过滤值 'colour = white' 的按钮之一来进一步过滤数据库,然后 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 过滤器按钮时,它会使用预定义的过滤器值 [= =50=] 但是它会重置所有先前选择的过滤器选项。
除了使用 link_to 选项之外,我的方法是否正确或是否有更好的方法?
解决方案
我终于使用 rail 的作用域方法和一个简单的 jQuery 代码实现了这一点,如下面的最终代码所示。我最初做错的一件事是我将范围的名称设置为与我的数据库列名称之一相同,这导致了错误。一旦我将范围名称更改为 'status1',而不是 'stock_no',它就开始工作了。希望这会有所帮助。
定义范围
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' %>
试试这个 。这有点像你想做的,除了提交按钮之外,只是让你的按钮成为过滤按钮。它需要在您的 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
我将以下内容放入我的应用程序中(其中状态是数据库中的一列,就像您的 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
您确定将示波器置于正确的型号中吗?
替换
<%= 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 %>
这里假设是
Once the database is first filtered with a brand name, then I would like users to be able to further filter the database by clicking one of the buttons which has a pre-defined filter value
我正在使用 Ransack gem 开发一个 rails 应用程序,下面是我到目前为止编写的用于过滤我的数据库的代码,它非常有用。现在我要做的是向我的索引视图添加额外的按钮,如过滤器选项(每个按钮都有预定义的过滤器值)。换句话说,一旦数据库首先使用品牌名称进行过滤,那么我希望用户能够通过单击具有预定义过滤值 'colour = white' 的按钮之一来进一步过滤数据库,然后 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 过滤器按钮时,它会使用预定义的过滤器值 [= =50=] 但是它会重置所有先前选择的过滤器选项。
除了使用 link_to 选项之外,我的方法是否正确或是否有更好的方法?
解决方案
我终于使用 rail 的作用域方法和一个简单的 jQuery 代码实现了这一点,如下面的最终代码所示。我最初做错的一件事是我将范围的名称设置为与我的数据库列名称之一相同,这导致了错误。一旦我将范围名称更改为 'status1',而不是 'stock_no',它就开始工作了。希望这会有所帮助。
定义范围
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' %>
试试这个 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
我将以下内容放入我的应用程序中(其中状态是数据库中的一列,就像您的 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
您确定将示波器置于正确的型号中吗?
替换
<%= 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 %>
这里假设是
Once the database is first filtered with a brand name, then I would like users to be able to further filter the database by clicking one of the buttons which has a pre-defined filter value