0

因此,我有搜索表单,并且显然可以从任何页面进行搜索。我认为将应用程序控制器的此类操作放置在 layouts/views 文件夹中是有道理的。但我就是不明白——Rails 没有看到。所以我不能这样做吗?那么我应该如何提供可从任何页面获得的操作?代码:

def tests_search
  @tests=Test.test_search(params[:query])

  respond_to do |format|
  format.html
  end
  end

路线:

 search_tests GET    /search_tests(.:format)             application#tests_search

形式:

 <%= form_tag search_tests_path, {:id=>'test_search',:method => :get} do%>

错误:

  Unknown action

The action 'tests_search' could not be found for ApplicationControllerr
4

3 回答 3

1

最初,您必须向自己解释流程。您需要的是在所有页面上呈现的部分内容,如果用户向其中添加一些输入并提交,他会得到一些输出。正确的?好的。所以你首先在某处创建一个新的部分

app/views/shared/_search.html.erb

然后,您在 routes.rb 中创建路由以指向控制器的操作。您不必将它放在 application_controller 中。相反,创建您的 search_controller.rb 并创建一些响应表单提交的操作。

每当您想在其他页面上呈现您的搜索表单时,您只需调用 render partial (更多内容在这里)与类似

<%= render "shared/search" %>

如果您创建了上面的文件,这很好。确保您的操作存在并且名称正确,在您的情况下应该是:

def test_search
...
end

祝你好运。

于 2013-05-10T20:22:13.310 回答
1

我建议使用其他控制器来执行此操作。例如,SearchController即使只有一种方法也可以。

请注意,ApplicationController默认情况下,应用程序中的每个其他控制器都继承自该控制器。因此,如果不是这样,这可能是有道理的,但是现在每个控制器都会继承您的test_search操作,这是不希望的。

如果您的搜索表单是部分的,那么无论是在其他控制器中ApplicationController还是在任何其他控制器中都没有区别。你只需要指向正确的路线。

于 2013-05-10T20:20:41.850 回答
1

您应该创建一个新的搜索控制器。使用rails g controller search indexwhich 将创建一个带有index操作的搜索控制器(您也可以将操作称为类似result)。然后search/_form.html.erb在您的搜索视图文件夹中添加一个文件,格式为:

 <%= form_tag search_path, {:id=>'test_search',:method => :get} do |f| %>

并将其呈现在layout/application.html.erb您想要的位置:

<%= render "search/form" %>

这样,您在任何页面上都有一个搜索表单,它使用SearchController来处理搜索请求。

于 2013-05-10T20:28:52.593 回答