运行 在使用 Ransack 显示结果之前在另一个页面上的 Controller 中使用方法

Run method in Controller on another page before showing results with Ransack

我的问题

使用 Ransack,当点击提交时,有没有办法在另一个页面上显示结果之前调用一个方法。

总结

我有一个名为 manualPull 的页面,其中包含一个 search_field:

<%= search_form_for @q do |f| %>
      <div class="field">
        <%= f.label :Username_cont, "Lookup"  %>
        <%= f.search_field :Username_cont %>
      </div>

      <div class="actions"><%= f.submit "Pull & Search"%></div>

<% end %>

基本上我想要发生的是当用户点击提交按钮时,我们将调用另一个页面的控制器(sessions_controller#manuallookupsession)从我们的数据库中提取数据然后显示结果在另一页上。

我试过的

我尝试将 url: 'sessions_controller#manuallookupsession' 添加到 search_form_for :

<%= search_form_for @q do |f|, url: 'sessions_controller#search' %>
         <div class="field">
           <%= f.label :Username_cont, "Lookup"  %>
           <%= f.search_field :Username_cont %>
         </div>
   
         <div class="actions"><%= f.submit "Pull & Search"%></div>
   
<% end %>

我还在 sessions_controller before_action :index, only: [:search]

中添加了以下行

从某种意义上说,这几乎是有效的,它会在新页面中显示搜索结果,但不会 运行 sessions_controller 中的 manuallookupsession 方法。另一个奇怪的行为是,每次我刷新 manualPull 页面时,manuallookupsession 方法都会 运行,但在我单击提交时不会。

更新1:

session_controller

这是我的 session_controller:

的代码
class PppoeSessionsController < ApplicationController
  before_action :index, only: [:search]
  def index
    @q = Session.ransack(params[:q])
    @session = @q.result.order(:username).page params[:page]
    @sessions_to_export = @q.result.order(:username).all
    respond_to do |format|
      format.html
      format.csv { render text: @sessions_to_export.to_csv }
      format.xlsx
    end
  end
 end
 def search
    puts("TEST")
    @username = params[ 'username' ]
    @sessionsearch = Session.new
    @sessiondetails = Session.new
    if @username
      @sessiondetails = @sessionsearch.pull_user(@username)
      respond_with(@pppoe_session)
    end
 end

根据你给出的信息,你的before_action语法有点奇怪,你能用这个代替吗:

before_action :search, only: [:index], if: -> { params[:username] }

通过这种方式,您还应该在 session_controller.

中删除 search 方法中的 if 语句

以下是最终对我有用的方法: 在我的 search_form_for 中,我添加了一个名为搜索的隐藏字段,如下所示:

  <%= search_form_for @q, url: 'sessions_controller' do |f| %>
    <div class="field">
      <%= f.label :username_eq, "Lookup"  %>
      <%= f.search_field :username_eq %>
      <%= hidden_field_tag "search", true %>
    </div>

    <div class="actions"><%= f.submit "Refresh & Search" %></div>

  <% end %>

在我的 sessions_controller 中,我将以下检查添加到我的索引 class:

if params[:search] == "true" && params[:commit] == "Refresh & Search"
      search #This is a call to a method
end

此外,在我的搜索 class 中,我能够使用以下代码从 URL 中检索输入的用户名(因为它是一个获取请求而不是 post 请求) (你需要require 'cgi'开头的class):

      url = request.original_fullpath.split("/").last
      parameter_hash = CGI.parse(URI.parse(url).query)
      @username = parameter_hash["q[username_eq]"][0].to_s

感谢@morissetcl 在您上一个答案的评论中引导我找到正确答案。

我希望有一种方法可以给你积分。