Соглашение об именах маршрутизации 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>

в моем файле route.rb я объявил контроллер ресурсом, как и все остальные

resources :project_templates 

Если я изменю ссылку для использования

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

тогда это работает отлично?! Почему соглашение об именах action_controller_path не работает в этом случае?


person Nick    schedule 14.07.2011    source источник
comment
работает ли new_project_template_path? Если да, то это из-за библиотек перегибов   -  person Jim Deville    schedule 14.07.2011
comment
Вы уже запускали rake routes, чтобы проверить, существует ли маршрут, как вы думаете?   -  person polarblau    schedule 14.07.2011


Ответы (3)


Вы можете найти все маршруты и их имена в командной строке с помощью rake routes.

Rails знает о множественном числе, которое вы используете, поэтому он может волшебным образом удалить его и назвать маршрут new_project_template_path без 's'?

person stef    schedule 14.07.2011
comment
Да, это действительно было из-за множественного числа, new_project_template_path работает просто отлично. Спасибо, парни :) - person Nick; 14.07.2011

Простое дополнение к предыдущим сообщениям, отмечающее возможность запуска рейк-маршрутов. Если в системе POSIX, пропустите результат через grep или другой текстовый фильтр.

rake routes | grep project

or

bundle exec rake routes | grep project

Сгенерированных маршрутов может быть очень много в крупных проектах, поэтому я предлагаю стать гуру инструментов командной строки, чтобы эффективно обрабатывать данные.

person recursive    schedule 14.07.2011
comment
Теперь вам не нужно использовать bundle exec, просто используйте bundle install --binstubs и export PATH=./bin:$PATH. Что я делал в прошлом, так это просто добавлял строку экспорта в мой файл .rvmrc и добавлял bin файл .gitignore. - person recursive; 06.08.2011

Если вы используете 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]
person PeterWong    schedule 14.07.2011