Вложенные ресурсы в пространстве имен form_for - PullRequest
30 голосов
/ 27 апреля 2010

Задача

Помощник form_for неправильно определяет путь к моему вложенному ресурсу внутри пространства имен. Рассматриваются следующие модели: Forum :: Thread и Forum :: Reply соответственно, находящиеся в подпапке с именем "forum" в каталоге моих моделей. Это в Rails 3 BETA 3.

routes.rb

  namespace :forum do
    root :to => 'threads#index'
    resources :threads do
      resources :replies
    end
  end

приложение / просмотров / форум / ответы / _form.html.haml

...
  - form_for [@thread, @reply] do |f|
...

приложение / контроллеры / форум / replies_controller.rb

...
  def new
    @reply = Forum::Reply.new
  end
...

Error

undefined method `forum_thread_forum_replies_path'

В отношении строки, описанной выше в _form.html.haml

Ответы [ 3 ]

47 голосов
/ 28 апреля 2010

Отредактированное решение в случае, если люди не читают реакции:

<%= form_for [:admin, @person, @image] do |f| %>

Старый ответ:

У меня есть проект с пространством имен администратора и ресурсами People и Images, так я создаю свою форму form_for в rails3, я пока не нашел способа сделать ее чище ...

<%= form_for [@person, @image], :url => admin_person_images_path do |f| %>
2 голосов
/ 03 мая 2014

В Rails 3 единственное решение, которое работало для меня корректно (как для нового, так и для редактируемого ресурса), было:

form_for @image, :url => url_for([:admin, @person, @image])
2 голосов
/ 18 ноября 2013

@ Дуглас: Это не работает для меня. На мой взгляд, имена в маршрутах должны быть множественными. Когда мне нравится, как рекомендуется, ошибка:

undefined method `admin_admin_person_admin_image_path' for #<#<Class:0x55976d0>:0x55a9bc8>

Мое решение, которое работало для New:

form_for @image, url: admin_person_images_path(@person, @image)

Мое решение, которое работало для Edit:

form_for @image, url: admin_person_image_path(@person, @image)

Есть ли решение объединить это в одной форме?

Редактировать (Решение для нового вложенного маршрута в пространстве имен в форме):
Теперь у меня была следующая логика в route.rb

resources :mobile_users do
 namespace :candystore do
  resource :transactions
 end
end

Форма для new_mobile_user_candystore_transactions:

<%= form_for [@mobile_user], url: mobile_user_candystore_transactions_path(@mobile_user), method: :post do |f| %>

чтобы получить метод создания Candystore :: TransactionsController, а не, например, метод создания MobileUser или метод обновления Candystore :: TransactionsController.

...