2011-07-14 168 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