搜索多个控制器

时间:2015-01-27 04:44:51

标签: ruby-on-rails search solr

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

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

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 %>

我使用params[:option]的第1行的特别说明,这会填充“选项”字段中的信息,因此,如果我选择“教师”,该选项将变为instructors。< / em>

问题:在主页上输入名称并单击搜索时,创建的网址如下:

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

我觉得我在某个地方犯了一个建筑错误,任何输入都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

  

我觉得我在某个地方犯了一个建筑错误,任何输入都会受到赞赏。

完全正确。错误是这样的:params[:option]是服务器端值。要访问服务器,您将使用表单提交创建请求。表单使用服务器端params[:option]决定提交的位置。这就像试图通过自己的引导来拉扯自己。

更详细地说,会发生什么:

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

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

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