RoR路由非常基本的问题

时间:2010-08-15 20:28:16

标签: ruby-on-rails ruby routing url-routing

我有考试控制器。

在routes.rb中有“资源:考试”

在控制器中有类似REST的生成方法。

我想在那里添加自己的方法:

def search
  @exams = Exam.where("name like ?", params[:q])
end

在视图文件中:

<%= form_tag(search_path, :method => "post") do %>
  <%= label_tag(:q, "Szukaj: ") %>
  <%= text_field_tag(:q) %>
  <%= submit_tag("Szukaj") %>
<% end %>

我知道,目前还没有结果显示,此时它根本不起作用(:

当我转到http://localhost:3000/exams/search时,它将其映射到显示控制器,搜索是:id参数然后......

如何让http://localhost:3000/exams/search运行搜索控制器?

2 个答案:

答案 0 :(得分:3)

你忘记添加路线了。在routes.rb

之前将其放在resources :exams
map.search '/exams/search', :controller => :exams, :action => :search

注意,resources :exams不会为控制器的所有公共方法生成路由,它会生成非常具体的路由集。您可以在rails routing guide中找到更多信息。 (特别参见第3.2节)

答案 1 :(得分:2)

您需要在映射中添加其他参数。你可以像这样添加“集合”方法:

map.resources :exams, :collection => {:search => :get}

当你rake routes时,你会发现它产生了类似的东西:

search_exams GET    /exams/search(.:format)    {:controller=>"exams", :action=>"search"}
       exams GET    /exams(.:format)           {:controller=>"exams", :action=>"index"}
             POST   /exams(.:format)           {:controller=>"exams", :action=>"create"}
    new_exam GET    /exams/new(.:format)       {:controller=>"exams", :action=>"new"}
   edit_exam GET    /exams/:id/edit(.:format)  {:controller=>"exams", :action=>"edit"}
        exam GET    /exams/:id(.:format)       {:controller=>"exams", :action=>"show"}
             PUT    /exams/:id(.:format)       {:controller=>"exams", :action=>"update"}
             DELETE /exams/:id(.:format)       {:controller=>"exams", :action=>"destroy"}