2011-07-14 233 views
0

由於某些原因,某個特定控制器的傳統路徑名稱不起作用? (Rails 3.1)Rails路由名稱約定

我使用ryan bates漂亮的腳手架創建了一個控制器。只是一個控制器,沒有底層模型。

控制器

class ProjectTemplatesController < ApplicationController 
# a bunch of stuff 

    def new 
    @project = Project.new 
    end 

#more stuff 
end 

在我的視圖(app /視圖/ project_templates/index.html.erb)我有:

<p><%= link_to "New Project Templates", new_project_templates_path %></p> 

但我得到的錯誤

undefined local variable or method `new_project_templates_path' for #<#<Class:0x2ab9c24>:0x2ab80e0> 

在我routes.rb文件我宣佈控制器像所有其他的資源

resources :project_templates 

如果我更改鏈接使用

<%= link_to "New Project Templates", {:controller=>"project_templates, :action=>"new"} %>

然後它完美?爲什麼在這種情況下action_controller_path的命名轉換不起作用?

+0

new_project_template_path有效嗎?如果是這樣,那將是由於變形庫 –

+0

您是否已經運行'rake routes',檢查路線是否存在,就像您認爲的那樣? – polarblau

回答

1

您可以通過rake routes在命令行中找到所有路由及其名稱。

Rails知道你正在使用的多元化,所以它可以神奇地將其刪除,並命名沒有's'的路線new_project_template_path

+0

是的,它確實是由於多元化,new_project_template_path工作得很好。謝謝你們:) – Nick

0

如果您正在使用resources :project_templates,你可以安全地做這樣的事情:

link_to "All Project Templates", :project_templates 
link_to "New Project Template", [:new, :project_template] 
link_to "Edit Project Template", [:edit, @project_template] 
link_to "Show Project Template", @project_template 
link_to "Delete Project Template", @project_template, :method => :delete 
form_for ProjectTemplate.new do |f| 
form_for @projectTemplate do |f| 

這樣,您就不必記住多個或單個問題。

還有一件事是,你實際上可以把它們全部包裝在[]中,這樣你就不用擔心它們了。

link_to "All PT", [:project_templates] 
link_to "Show PT", [@project_template] 
1

以前的帖子的簡單補充說明可能運行耙路線。如果在POSIX系統上,通過grep或其他文本過濾器運行結果。

rake routes | grep project 

bundle exec rake routes | grep project 

生成的路由可以得到在大projets非常豐富,所以我建議成爲一個命令行工具大師爲了有效地數據緊縮。

+0

現在你不需要使用'bundle exec',只需使用'bundle install --binstubs'和'export PATH =。/ bin:$ PATH'。我過去所做的只是將輸出行添加到我的'.rvmrc'文件中,並將'.gitignore'添加到'bin'中。 – recursive