2011-02-05 2 views
14

Я вложенные ресурсы, как это в моем routes.rb - (my rake:routes gist)Rails 3 вложенная проблема маршрута ресурс, как form_for

namespace(:admin) do 
    resources :restaurants do 
    resources :menus 
    resources :menu_items 
    end 
end 

В контроллере:

def new 
    @restaurant = Restaurant.find(params[:restaurant_id]) 
    @menu_item = @restaurant.menu_items.build 
end 

Попытка создать новый MenuItem (действие #new), по адресу: http://127.0.0.1:3001/admin/restaurants/1/menu_items/new я получаю ошибку:

NoMethodError in Admin/menu_items#new 

Showing /home/fps/workspace3/peded/app/views/admin/menu_items/_form.html.erb where line #1 raised: 

undefined method `admin_menu_items_path' for #<#<Class:0xb6582d78>:0xb6581f2c> 
Extracted source (around line #1): 

1: <%= form_for @menu_item do |f| %> 
... 

Ho w Я делаю эту форму работы? Он был создан из щегольской: эшафот

UPDATE

Я также попытался это в _form:

<%= form_for [:restaurant, @menu_item] do |f| %> 

Но закончилась с подобной ошибкой:

Showing /home/fps/workspace3/peded/app/views/admin/menu_items/_form.html.erb where line #1 raised: 

undefined method `restaurant_admin_menu_items_path' for #<#<Class:0xb68162b0>:0xb6813dd0> 
Extracted source (around line #1): 

1: <%= form_for [:restaurant, @menu_item] do |f| % 

В случае, если Я делаю ошибку?

+2

Вы решили эту проблему? Вложенный ресурс в пространстве имен администратор должен создать маршрут admin_restaurant_admin_menu_items_path, но создать маршрут admin_restaurant_menu_items_path. The: администратор пространства имен уже установлены в контроллере, если вы эшафот админ/меню Это должно быть ошибка в рельсах? – bandola

+0

@bandola Я спросил/ryanb, и он указал, что это, скорее всего, ошибка –

+0

@FabianoPS: любые новости об этом? Все равно получите то же сообщение об ошибке, что и вы! – Aymeric

ответ

11

Я думаю, что проблема в форме. Это работает для меня:

<%= form_for(@menu_items, :url => restaurant_menu_items_path(@menu_items.restaurant)) do |f| %> 
+3

При таком подходе я получаю сообщение об ошибке: Нет совпадений маршрутов {: action => "show",: controller => "menu_items"} –

2

Вы можете найти свои маршруты, выполнив командную строку.

rake routes 

Похоже, вы неправильно назовете свои маршруты.

Массив обозначений будет:

И названный маршрут для создания:

admin_restaurant_menu_items_path(@restaurant) 
+0

Первый, выход: 'undefined method' admin_admin_restaurant_admin_menu_items_path 'для # <# <Класс: 0xb665b448>: 0xb665a570> ' –

+0

Второй, выход:' undefined method 'admin_menu_items_path 'для # <# <Класс: 0xb6864780>: 0xb6863790>' –

12

form_for([@restaurant, @menu_item])

+1

Из-за namedscope он дает: 'undefined method' admin_restaurant_admin_menu_items_path' для # <# <Класс: 0xb660ada4>: 0xb6609ecc> 'Так что я могу только подумать есть ошибка –

+0

Спасибо, это сработало для меня –

+0

Для решения без использования пространства имен, сработало! Благодаря! – CloudRide

8

У меня тот же вопрос. Единственное решение, которое я нашел, - это передать URL-адрес form_for.

<% url = (action_name == "new" ? {:action=>"create", :controller=>"admin/menu_item"} : {:action=>"update", :controller=>"admin/menu_item"})%> 

<%= form_for [@restaurant ,@menu_item], :url=>url do |f| %> 

Еще одно замечание, вы не получите params[:menu_item] back, вместо этого вы увидите params[:admin_menu_item].

Надеюсь, что это поможет!

+0

Единственное, что помогло мне, даже если оно выглядит уродливо – atkit

+0

Отлично! Это сэкономило мой день –

0

Единственное решение, которое работало для меня правильно (как для новых и редактирования ресурса) был:

form_for @menu_item, :url => url_for([:admin, @restaurant, @menu_item]) 
1

Работа с вложенными ресурсами и пространствами имен является Вьетнам (пита).

Вот мой противный решение:

= form_for @admin_menu_item, 
    :url => (@admin_menu_item.try(:new_record?) ? 
     admin_restaurant_menu_items_path(@admin_restaurant) : 
     admin_menu_item_path(@ admin_menu_item)) do |f| 
    ... 

Я надеюсь, что вы можете помочь.

0

Я использую Rails 5 (не то, что я предполагаю, что это имеет значение), и это работает для меня:

= simple_form_for [:admin, @restaurant, @menu_item] do |f| 

Тот факт, что это simple_form_for, а не form_for вероятно, не имеет ни.

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