跨多个控制器搜索



所以我正在做一个Rails项目,在这个项目中,我有一个前端与多个控制器交互以检索信息。我有instructorscourses控制器,我正在尝试实现一个搜索功能,我可以使用下拉框选择要从哪个控制器中搜索,当我单击搜索按钮时,它只会搜索选定的控制器。

我在主页上的搜索框如下所示:

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] ,但未设置此类选项。未指定表单操作时的默认值与您所在的页面相同。
  • 客户端显示窗体。用户选择教师并提交表单。
  • 客户端联系表单的操作(即同一页面),并传输表单的值(optionsearch
  • 服务器端/接收请求,并呈现表单
  • 这一次,params[:option]设置为instructors
  • 客户端再次提交表单;这一次,表单具有正确设置的action(上一个周期收到的params[:option]

解决此问题的两种简单方法是:

  • 使用 JavaScript 在选择option时动态修改表单的 action 属性
  • 创建一个专用的搜索控制器/操作,该
  • 控制器/操作将处理这两种类型的搜索,具体取决于params[:option]的值
  • 在服务器端执行另一个操作,将您的请求重定向到其他两个操作之一,具体取决于params[:option]的值

最新更新