跨多个控制器搜索

Search across multiple controllers

所以我正在开发一个 Rails 项目,在该项目中我有一个前端与多个控制器交互以检索信息。我有 instructorscourses 控制器,我正在尝试实现一个搜索功能,我可以 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 并提交表单。
  • 客户端联系表单的操作(即同一页面),并传输表单的值(optionsearch
  • 服务器端/接收请求,并呈现表单
  • 这次params[:option]设置为instructors
  • 客户端再次提交表单;这次,表格正确设置了 action(从上一个周期收到的 params[:option]

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

  • 使用 JavaScript 在选择 option 时动态修改表单的 action 属性
  • 根据 params[:option]
  • 的值进行专门的搜索 controller/action 来处理这两种类型的搜索
  • 根据 params[:option]
  • 的值,在服务器端执行另一个操作,将您的请求重定向到其他两个操作之一