从application_controller渲染视图

时间:2013-05-10 20:05:36

标签: ruby-on-rails

所以,我有搜索表单,显然可以从任何页面进行搜索。 我认为有意义的是,应用程序控制器中的此类操作放在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

3 个答案:

答案 0 :(得分:1)

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

请注意,ApplicationController是控制器,应用程序中的每个其他控制器都默认继承。因此,如果情况不是这样,它可能有意义,但现在每个控制器都将继承您的test_search动作,这是不可取的。

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

答案 1 :(得分:1)

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

中创建一个新的部分
app/views/shared/_search.html.erb

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

每当您想要在其他网页上呈现搜索表单时,只需使用类似

的内容调用render partial(more on that here
<%= render "shared/search" %>

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

def test_search
...
end
祝你好运。

答案 2 :(得分:1)

您应该创建一个新的搜索控制器。使用rails g controller search index将创建一个带有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来处理搜索请求。