【发布时间】:2017-07-18 22:47:18
【问题描述】:
我正在使用 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 过滤器按钮时,它会使用预定义的过滤器值“白色”过滤数据库,但它会重置所有先前选择的过滤选项。
我的方法是正确的还是比使用 link_to 选项更好的方法?
解决方案
我终于使用 rail 的 scope 方法和一个简单的 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' %>
【问题讨论】:
-
嗨 jin,document.getElementById().value = 1 是做什么的?
标签: ruby-on-rails ajax ransack