【问题标题】:Ransack search include parameterRansack 搜索包含参数
【发布时间】:2016-03-02 15:06:44
【问题描述】:

我正在使用 gem 'ransack' 来搜索记录。

我正在编程的页面仅从一个下拉列表开始以选择@department。 之后,我希望 Ransack 在@department 内搜索。

我需要在 Ransack 搜索参数中包含一个附加参数 department=2。 (如果我将它插入浏览器 URL 就可以了)。

我输入 department=2 后的浏览器 URL

http://localhost:5000/departments/costfuture?department=2&utf8=%E2%9C%93&q%5Bid_eq%5D=&q%5Bproject_year_eq%5D=&q%5Boriginal_year_eq%5D=&q%5Bclient_id_eq%5D=43&q%5Blocation_name_cont%5D=&q%5Bproject_name_cont%5D=&q%5Bcoststatus_id_in%5D%5B%5D=&q%5Bcoststatus_id_not_in%5D%5B%5D=&q%5Brebudget_true%5D=0&q%5Bnew_true%5D=0&q%5Bconstruction_true%5D=0&q%5Bmaintenance_true%5D=0&commit=Search

这是控制器:

  def costfuture

    @departments = current_user.contact.departments
    if params[:department]
      @department = Department.find(params[:department])
      @search = @department.costprojects.future.search(params[:q])
      @costprojects = @search.result.order(:department_priority)
    end

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @departments }
    end
  end

我在视图中试过这个:

<%= search_form_for @search, url: departments_costfuture_path(:department => @department.id) do |f| %>

但是,生成的 URL 缺少 department=2

【问题讨论】:

    标签: ruby-on-rails ransack


    【解决方案1】:

    如果您想将 department 选项传递给 Ransack,您可以使用 search_form_for 中的隐藏字段来执行此操作:

    <%= search_form_for @search, url: departments_costfuture_path do |f| %>
      <%= f.hidden_field :department_eq, value: @department.id %>
      <%# Other form code here %>
    <% end %>
    

    但是,如果您想搜索特定部门,那么最好使用 Rails 路线。修改config/routes.rb可以生成/departments/2/costfuture之类的URL:

    resources :departments do
      get 'costfutures', on: :member
    end
    

    现在您可以使用生成的 URL 帮助程序来生成将设置为 params[:id] 的链接,并且您可以使用它来检索 @department

    【讨论】:

    • 感谢您的帮助 - 但是,该行给了我“2:Fixnum 的未定义方法 `merge'”
    • 如果没有看到完整的错误和您的控制器操作(可能还有您的模型定义),这将很难追踪。请您将这些添加到您的问题中吗?
    • 这在 &lt;%= f.hidden_field :department_eq, :value =&gt; @department.id %&gt; 视图中有效。但是,我需要从params[:q] 中提取部门=x。知道该怎么做吗?
    • 这在控制器中起作用 - 获取隐藏的 department_eq - `@department = params[:q][:department_eq]`
    • 感谢您的更新 - 我在回答中添加了更多详细信息。 :)
    【解决方案2】:

    我最终在search_form_for 中使用了hidden_field_tag

    <%= search_form_for @search, url: departments_costfuture_path do |f| %>
      <%= hidden_field_tag :department, @department.id %>
      <%= f.search_field :last_name_or_first_name_cont %>
    <% end %>
    

    然后params[:department]params[:search] 将可以在控制器中访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      相关资源
      最近更新 更多