Rails路由名称约定

时间:2011-07-14 06:38:59

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

由于某种原因,特定控制器的常规路径名不起作用? (Rails 3.1)

我使用ryan bates nifty scaffold创建了一个控制器。只是一个控制器,没有底层模型。

在控制器中我

class ProjectTemplatesController < ApplicationController
# a bunch of stuff

  def new
    @project = Project.new
  end

#more stuff
end

在我看来(app / views / 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的命名对象在这种情况下不起作用?

3 个答案:

答案 0 :(得分:2)

您可以使用rake routes在命令行中找到所有路由及其名称。

Rails知道你正在使用的复数,所以它可以神奇地删除它并命名路由new_project_template_path而没有's'?

答案 1 :(得分:2)

以前帖子的简单附录,指出可以运行佣金路线。如果在POSIX系统上,通过grep或其他文本过滤器运行结果。

rake routes | grep project

bundle exec rake routes | grep project

生成的路由在大型项目中可以变得非常丰富,因此我建议成为命令行工具大师,以便有效地处理数据紧缩。

答案 2 :(得分: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]