Rails не может соответствовать существующему маршруту - PullRequest
0 голосов
/ 01 октября 2011

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

В моем route.rb

resources :user do
  resource :account
  resource :addresses
end

И теперь все в порядке.У меня есть какой-то метод помощника пути.Например,

user_addresses_path

, этот вспомогательный метод отлично работает везде (я имею в виду, что он работает в каждом шаблоне представления), кроме одного места.Он не может работать в шаблоне просмотра моего пользователя.Я покажу вам удар.

#it works here.
#this file is under app/view/address
<%= user_addresses_path(@user) %>    

#it doesn't work here.
#this file is under app/view/user
<%= user_addresses_path(@user) %>

Просто для удобства я не вставляю сюда все коды.

Но если вы понимаете, о чем я, вы знаете, просто скажитемне, почему это происходит.

Добавьте комментарий, если вы хотите более подробно.

1 Ответ

2 голосов
/ 01 октября 2011

Я полагаю, что проблема заключается в том, что у вас есть адресный маршрут, определенный как вложенный маршрут для пользователя.В частности, в документации rails говорится:

Передача записи (например, Active Record или Active Resource) вместо Hash, поскольку параметр options будет запускать именованный маршрут дляэта запись.Поиск произойдет по названию класса.Таким образом, передача объекта Workshop будет пытаться использовать маршрут workshop_path.Если у вас есть вложенный маршрут, такой как admin_workshop_path, вам придется вызывать его явно (для url_for невозможно угадать этот маршрут).

Другими словами, поскольку маршрут, на который делается ссылка, определенкак вложенный маршрут, рельсы не могут угадать маршрут.Поскольку адреса вложены в пользователя, он может угадать пользователя, когда он находится на определенном адресе, но не адрес, когда он находится на уровне пользователя.

Кроме того, возможно, что то, что у вас есть, является«ко многим» отношение пользователя к адресу?Если это так, тогда ваш resource может быть resources (множественное число) в вашем файле маршрутов.

resources :user do
  resource :addresses
end

дает вам:

user_addresses         POST   /user/:user_id/addresses(.:format)        {:action=>"create", :controller=>"addresses"}
new_user_addresses     GET    /user/:user_id/addresses/new(.:format)    {:action=>"new", :controller=>"addresses"}
edit_user_addresses    GET    /user/:user_id/addresses/edit(.:format)   {:action=>"edit", :controller=>"addresses"}
                       GET    /user/:user_id/addresses(.:format)        {:action=>"show", :controller=>"addresses"}
                       PUT    /user/:user_id/addresses(.:format)        {:action=>"update", :controller=>"addresses"}
                       DELETE /user/:user_id/addresses(.:format)        {:action=>"destroy", :controller=>"addresses"}

но,

resources :user do
  resources :addresses
end

дает вам:

                    POST   /user/:user_id/addresses(.:format)          {:action=>"create", :controller=>"addresses"}
new_user_address    GET    /user/:user_id/addresses/new(.:format)      {:action=>"new", :controller=>"addresses"}
edit_user_address   GET    /user/:user_id/addresses/:id/edit(.:format) {:action=>"edit", :controller=>"addresses"}
user_address        GET    /user/:user_id/addresses/:id(.:format)      {:action=>"show", :controller=>"addresses"}
                    PUT    /user/:user_id/addresses/:id(.:format)      {:action=>"update", :controller=>"addresses"}
                    DELETE /user/:user_id/addresses/:id(.:format)      {:action=>"destroy", :controller=>"addresses"}

Обратите внимание, что второй вариант (множественное число) дает вам маршруты, чтобы иметь возможность адресовать несколько адресов для каждого пользователя, тогда как единственный маршрут дает вам только одинадрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...