运行 在使用 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 在您上一个答案的评论中引导我找到正确答案。
我希望有一种方法可以给你积分。
我的问题
使用 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 在您上一个答案的评论中引导我找到正确答案。
我希望有一种方法可以给你积分。