2013-05-10 178 views
0

因此,我有搜索表单,并且搜索可以从任何页面显然有效。 我认为这是有道理的,从应用程序控制器这样的行动是放置在布局/视图文件夹。 但我只是不明白 - Rails没有看到它。所以我不能这样做?那么我应该如何提供可从任何页面上获得的行动? 代码:从application_controller呈现视图

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 
+0

尝试重新启动您的服务器,也许 – MrYoshiji 2013-05-10 20:13:13

+0

applications_controller#tests_search =>视图应该放在应用程序/视图/应用/ test_search.html.erb。或者什么是你的问题? :) – Mattherick 2013-05-10 20:17:27

回答

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来处理搜索请求。

1

我会建议使用其他控制器来做到这一点。即使只有一种方法,它也可以是例如SearchController

请注意,ApplicationController是应用程序中其他所有控制器默认继承的控制器。所以如果不是这样的话,这可能是有道理的,但是现在每个控制器都会继承你的test_search动作,这是不需要的。

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

1

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

app/views/shared/_search.html.erb 

然后开始的地方,你在routes.rb中创建你的路线,指向一个控制器的动作。你不必把它放在application_controller中。相反,创建您的search_controller.rb并创建一些响应表单提交的操作。

每当你想渲染上的其他网页搜索表单,您只需拨打渲染部分(more on that here)的东西,如

<%= render "shared/search" %> 

这是好事,如果你创建的文件上面。确保你的行为存在,名称是正确的,在你的情况下它应该是:

def test_search 
... 
end 

祝你好运。