跨多个控制器搜索
Search across multiple controllers
所以我正在开发一个 Rails 项目,在该项目中我有一个前端与多个控制器交互以检索信息。我有 instructors
和 courses
控制器,我正在尝试实现一个搜索功能,我可以 select 使用下拉框搜索哪个控制器,当我单击搜索按钮时,它只会搜索 selected 控制器。
我在主页上的搜索框是这样的:
http://i.stack.imgur.com/o7yzk.png(所以不让我嵌入图片)
制作代码如下:
<%= form_tag(params[:option], :method => "get", id: "search-form") do %>
<%= select(:option,options_for_select([['Instructors', 'instructors'], ['Courses', 'courses'],['Departments','departments']])) %>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search", :name => nil, html: {class: "button button-red"}%>
<% end %>
第 1 行的特别说明,我使用 params[:option]
,这会填充来自 'option' 字段的信息,所以如果我 select 'Instructors',选项变为instructors
.
问题:在首页输入名字点击搜索创建的url如下:
http://0.0.0.0:3000/?utf8=%E2%9C%93&option=%2Finstructors&search=John
它让我直接回到主页。我可以在调试信息中看到,它甚至没有到达正确的控制器,它只查看静态页面控制器。
如果我再次单击搜索按钮,它会将我带到具有正确搜索结果的正确页面:
http://0.0.0.0:3000/instructors?utf8=%E2%9C%93&option=%2Finstructors&search=john
我正在使用 Solr 进行搜索,除了这个需要多次点击的路径问题外,我的一切工作正常。 instructors
索引的控制器代码如下所示:
def index
if params[:search] != ''
@search = Instructor.search do
fulltext params[:search]
end
@instructors = @search.results
else
@instructors = Instructor.all
end
end
我觉得我在某个地方犯了架构错误,任何意见都将不胜感激。
I feel like I am making an architectural mistake somewhere, and any input would be appreciated.
完全正确。错误是这样的:params[:option]
是服务器端值。为了到达服务器,您正在使用表单提交创建请求。表单决定使用服务器端提交的位置 params[:option]
。这就像试图靠自己的力量来拉自己。
更详细地说,是这样的:
- 服务器端收到您的请求
/
- 服务器端呈现您的表单。表单的操作设置为
params[:option]
,但未设置此类选项。未指定表单操作的默认值是您所在的同一页面。
- 客户端显示表单。用户选择 Instructors 并提交表单。
- 客户端联系表单的操作(即同一页面),并传输表单的值(
option
和 search
)
- 服务器端
/
接收请求,并呈现表单
- 这次
params[:option]
设置为instructors
- 客户端再次提交表单;这次,表格正确设置了
action
(从上一个周期收到的 params[:option]
)
解决此问题的两种简单方法是:
- 使用 JavaScript 在选择
option
时动态修改表单的 action
属性
- 根据
params[:option]
的值进行专门的搜索 controller/action 来处理这两种类型的搜索
- 根据
params[:option]
的值,在服务器端执行另一个操作,将您的请求重定向到其他两个操作之一
所以我正在开发一个 Rails 项目,在该项目中我有一个前端与多个控制器交互以检索信息。我有 instructors
和 courses
控制器,我正在尝试实现一个搜索功能,我可以 select 使用下拉框搜索哪个控制器,当我单击搜索按钮时,它只会搜索 selected 控制器。
我在主页上的搜索框是这样的:
http://i.stack.imgur.com/o7yzk.png(所以不让我嵌入图片)
制作代码如下:
<%= form_tag(params[:option], :method => "get", id: "search-form") do %>
<%= select(:option,options_for_select([['Instructors', 'instructors'], ['Courses', 'courses'],['Departments','departments']])) %>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search", :name => nil, html: {class: "button button-red"}%>
<% end %>
第 1 行的特别说明,我使用 params[:option]
,这会填充来自 'option' 字段的信息,所以如果我 select 'Instructors',选项变为instructors
.
问题:在首页输入名字点击搜索创建的url如下:
http://0.0.0.0:3000/?utf8=%E2%9C%93&option=%2Finstructors&search=John
它让我直接回到主页。我可以在调试信息中看到,它甚至没有到达正确的控制器,它只查看静态页面控制器。
如果我再次单击搜索按钮,它会将我带到具有正确搜索结果的正确页面:
http://0.0.0.0:3000/instructors?utf8=%E2%9C%93&option=%2Finstructors&search=john
我正在使用 Solr 进行搜索,除了这个需要多次点击的路径问题外,我的一切工作正常。 instructors
索引的控制器代码如下所示:
def index
if params[:search] != ''
@search = Instructor.search do
fulltext params[:search]
end
@instructors = @search.results
else
@instructors = Instructor.all
end
end
我觉得我在某个地方犯了架构错误,任何意见都将不胜感激。
I feel like I am making an architectural mistake somewhere, and any input would be appreciated.
完全正确。错误是这样的:params[:option]
是服务器端值。为了到达服务器,您正在使用表单提交创建请求。表单决定使用服务器端提交的位置 params[:option]
。这就像试图靠自己的力量来拉自己。
更详细地说,是这样的:
- 服务器端收到您的请求
/
- 服务器端呈现您的表单。表单的操作设置为
params[:option]
,但未设置此类选项。未指定表单操作的默认值是您所在的同一页面。 - 客户端显示表单。用户选择 Instructors 并提交表单。
- 客户端联系表单的操作(即同一页面),并传输表单的值(
option
和search
) - 服务器端
/
接收请求,并呈现表单 - 这次
params[:option]
设置为instructors
- 客户端再次提交表单;这次,表格正确设置了
action
(从上一个周期收到的params[:option]
)
解决此问题的两种简单方法是:
- 使用 JavaScript 在选择
option
时动态修改表单的action
属性 - 根据
params[:option]
的值进行专门的搜索 controller/action 来处理这两种类型的搜索
- 根据
params[:option]
的值,在服务器端执行另一个操作,将您的请求重定向到其他两个操作之一