【问题标题】:Search across multiple controllers跨多个控制器搜索
【发布时间】:2015-01-27 04:44:51
【问题描述】:

所以我正在开发一个 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 %>

第 1 行的特别说明,我使用 params[:option],它填充了“选项”字段中的信息,因此如果我选择“讲师”,选项变为 instructors

问题:首页输入名字后点击搜索,创建的url如下:

http://0.0.0.0:3000/?utf8=%E2%9C%93&amp;option=%2Finstructors&amp;search=John

然后我马上回到主页。我可以在调试信息中看到,它甚至没有到达正确的控制器,它只是在查看静态页面控制器。

如果我再次单击搜索按钮,它会将我带到具有正确搜索结果的正确页面:

http://0.0.0.0:3000/instructors?utf8=%E2%9C%93&amp;option=%2Finstructors&amp;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

我觉得我在某个地方犯了一个架构错误,任何意见都将不胜感激。

【问题讨论】:

  • 在您的日志中,最初的搜索表单被提交给哪个控制器(谁首先生成搜索表单)?在那里您检查提交的参数以查看要搜索的模型,并使用搜索表单中的参数重定向到适当的控制器(讲师或课程)。
  • @railsdog: Started GET "/?utf8=%E2%9C%93&amp;option=%2Finstructors&amp;search=george" for 127.0.0.1 at 2015-01-26 21:25:52 -0700 Processing by StaticPagesController#home as HTML

标签: ruby-on-rails search solr


【解决方案1】:

我觉得我在某个地方犯了一个架构错误,任何意见都将不胜感激。

完全正确。错误是这样的:params[:option] 是服务器端值。为了访问服务器,您正在使用表单提交创建一个请求。表单决定使用服务器端params[:option] 提交到哪里。这就像试图通过自己的引导来拉动自己。

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

  • 服务器端收到你的/的请求
  • 服务器端呈现您的表单。表单的操作设置为params[:option],但没有设置这样的选项。未指定表单操作的默认值是您所在的页面。
  • 客户端显示表单。用户选择讲师并提交表单。
  • 客户端联系表单的操作(即同一页面),并传输表单的值(optionsearch
  • 服务端/接收请求,并渲染表单
  • 这一次,params[:option] 设置为instructors
  • 客户端再次提交表单;这次,表单有一个正确设置的action(从上一个循环收到的params[:option]

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

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

【讨论】:

    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2017-11-12
    • 2011-01-03
    相关资源
    最近更新 更多