【问题标题】:Rails filter with button or link_to using RansackRails 使用 Ransack 过滤按钮或 link_to
【发布时间】: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


【解决方案1】:

试试这个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

您确定将示波器放入正确的模型中吗?

【讨论】:

  • 嗨,蔡斯,谢谢!对于我正在尝试做的事情,这似乎是正确的解决方案。但是,由于我是 ROR 的新手,我正在努力定义(白名单)我的搜索范围。这是我所做的:(1) scope :color, -> { where(color_id: '2') } 然后 (2) def self.ransackable_scopes(auth_object = nil) [:color] end (3) 和我的查看页面, 然后 'submit', :class=> 'btn btn-primary scope-button color', :id => "color", :remote => true %>。我确定我没有正确执行此操作。有什么建议吗?谢谢。
  • 将以下内容添加到您的 button_tag 中::onclick =&gt; "document.getElementById('q_color').value = 1;"。这将使您的搜索结果使用您的范围进行过滤!如果您想添加更多与此类似的按钮,我建议您编写一些 jQuery 以在单击一个按钮时将其他按钮的值设置为 0。过滤器在值为 1 时应用,在 0 时被忽略。希望这会有所帮助!
  • 我将代码添加到我的按钮标签中,但仍然无法正常工作。我刚刚更新了我的问题,它显示了我迄今为止尝试过的代码。还有什么我可以尝试的吗?谢谢。
  • 当我添加这段代码'onclick => "document.getElementById('q_color').value = 1;'时,颜色的参数返回1。我不'认为它没有正确链接到范围。当我像这样':onclick =>“document.getElementById('q_color').value = 12525;”'将值更改为'12525'时,颜色的参数返回12525 的值,它过滤数据。我在这里很困惑。
  • 还是和上面提到的jQuery有关?
【解决方案2】:

替换

&lt;%= link_to "All",q: {color_cont: 'white'}, :class =&gt; 'link-sort', :remote =&gt; true, :method =&gt; :post %&gt;

与

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

这里的假设是

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

【讨论】:

  • 当我将代码替换为您上面建议的代码时,出现_undefined local variable or method `brand_id_eq'_的错误。此外,除了品牌过滤器之外,我的索引页面上实际上还有 5 个其他过滤器(为简单起见,仅提及一个)。有什么建议?谢谢。
  • 最简单的解决方案是在表单内为每个链接过滤器创建一个隐藏变量。当用户点击链接时,相关的隐藏变量应该使用 jQuery 更新,然后提交表单。
  • 谢谢阿米特。我得到了这个与范围一起工作。谢谢。
猜你喜欢
  • 2018-03-24
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多