所以我正在做一个Rails项目,在这个项目中,我有一个前端与多个控制器交互以检索信息。我有instructors
和courses
控制器,我正在尝试实现一个搜索功能,我可以使用下拉框选择要从哪个控制器中搜索,当我单击搜索按钮时,它只会搜索选定的控制器。
我在主页上的搜索框如下所示:
https://i.stack.imgur.com/o7yzk.png(SO不允许我嵌入图像)
制作它的代码如下:
<%= 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 %>
在我使用params[:option]
的第 1 行的特别说明中,它填充了"选项"字段中的信息,因此如果我选择"讲师",该选项将变为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
我觉得我在某处犯了一个架构错误,任何意见将不胜感激。
我觉得我在某处犯了一个架构错误,任何意见将不胜感激。
完全正确。错误是这样的:params[:option]
是服务器端值。为了访问服务器,您将使用表单提交创建请求。表单决定使用服务器端params[:option]
提交的位置。这就像试图通过自己的自力更生来拉自己。
更详细地说,发生的事情是这样的:
- 服务器端接收您的
/
请求 - 服务器端呈现表单。表单的操作设置为
params[:option]
,但未设置此类选项。未指定表单操作时的默认值与您所在的页面相同。 - 客户端显示窗体。用户选择教师并提交表单。
- 客户端联系表单的操作(即同一页面),并传输表单的值(
option
和search
) - 服务器端
/
接收请求,并呈现表单 - 这一次,
params[:option]
设置为instructors
- 客户端再次提交表单;这一次,表单具有正确设置的
action
(上一个周期收到的params[:option]
)
解决此问题的两种简单方法是:
- 使用 JavaScript 在选择
option
时动态修改表单的action
属性
创建一个专用的搜索控制器/操作,该 - 控制器/操作将处理这两种类型的搜索,具体取决于
params[:option]
的值 - 在服务器端执行另一个操作,将您的请求重定向到其他两个操作之一,具体取决于
params[:option]
的值