首页 > 解决方案 > Ransack Rails - 数组中的一个参数

问题描述

我是 Rails 的初学者,我尝试使用 Ransack 过滤结果。我有一个名为“adventures”的模型,它有很多参数,其中“main_activity”。我尝试在我的主页中实现一个表单,您可以在其中键入您正在寻找的活动类型(稍后我将实现一个下拉列表,因此它将仅限于现有活动)。

这是我的 pages_controller 中的内容:

def search
                  if params[:search].present? && params[:search].strip != ""
                     session[:bourse_aventuriers_search] = params[:search]
                  end

                  arrResult = Array.new

                  if session[:bourse_aventuriers_search] && session[:bourse_aventuriers_search] != ""

                     @adventures_main_activity = Adventure.where(active: true).all
                  else
                     @adventures_main_activity = Adventure.where(active: true).all
                  end

                  @search = @adventures_main_activity.ransack(params[:q])
                  @adventures = @search.result

                  @arrAdventures = @adventures.to_a

               end

在我的 home.html.erb

<%= form_tag search_path, method: :get do %>
    <div class="row">
        <div class="col-md-6">
            <%= text_field_tag :search, params[:search], placeholder: "Quelle activité ?",
            class:"form-control" %>
        </div>

目前,无论我在表格中输入什么,我都会在数据库中获得所有的“冒险”;我觉得这是合乎逻辑的,因为我没有更改 1st @adventures_main_activity = Adventure.where(active: true).all。我不知道如何更改它,以便它只会给我主要活动是我在表单中键入的关键字的冒险。谁能帮我 ?谢谢 :)

标签: ruby-on-railsransack

解决方案


我认为您的搜索中有很多多余的代码。您的控制器应该只需要 @q 参数,如下所示:

@q = Adventure.ransack(params[:q])
@adventures = @q.result

然后@adventures 将返回任何匹配项作为活动记录。

如果不传递任何参数,则查询将返回所有记录(与 Adventure.all 相同)。

当您提交表单时,ransack 搜索将传递一个“q”参数,该参数将包含所有表单项。你的可能看起来像这样:

"utf8"=>"✓", "q"=>{"search_cont"=>"rock climbing"}, "commit"=>"Search", "controller"=>"adventures", "action"=>"index"

如果您使用调试器,您可以通过在命令行中键入“params”来查看此信息。它也将出现在服务器输出中。

使用我在我的应用程序中所做的示例是我使用的确切代码:

看法:

  <%= search_form_for @q do |f| %>

    <div class="form-group col-sm-6">
      <%= f.label :email_cont, "Email:" %>
      <%= f.search_field :email_cont, :placeholder => "Please enter and email to search for", :class => "form-control" %>
    </div>

    <div class="form-group col-sm-3">
      <%= f.submit 'Search', :class => 'btn btn-primary' %>
      <%= link_to 'Reset', users_path, :class => 'btn btn-default' %>
    </div>

  <% end %>

控制器

  def index
    @q = User.ransack(params[:q])
    @users = @q.result(distinct: true).order(:email).page params[:page]
  end

这些类只是 Bootstrap CSS,如果您不使用引导程序,则不需要。

编辑

search_form_for @q 必须完全一样,并且必须在参数中设置 @q 才能使其工作。Ransack 对它们非常具体。所以你的@search

@search = @adventures_main_activity.ransack(params[:q])

应该是@q。在您看来,将您的 form_tag 更改为 search_form_for 它应该可以工作。祝你好运。


推荐阅读