Понимание маршрутизации в Rails 3 - PullRequest
1 голос
/ 23 октября 2010

Я думаю, что я думаю о маршрутизации все неправильно.У меня очень простая модель с двумя моделями: Продукт и Фото.Product has_many: photos, и Photo own_to: product.

У продукта есть полный каркас, в то время как у Photo есть фотоконтроллер, над которым я работаю.

В route.rb у нас есть: resources :products (генерируется эшафотом)

Поскольку фотографии являются вложенным ресурсом продукта, я изменил его на:

resources :products do
    resources :photos
  end

и, наконец,

root :to => "products#index"

Счастливо разбрасывает маршрутыout:

  products GET             {:controller=>"products", :action=>"index"}
  products POST            {:controller=>"products", :action=>"create"}
  new_product GET          {:controller=>"products", :action=>"new"}
  edit_product GET         {:controller=>"products", :action=>"edit"}
  product GET              {:controller=>"products", :action=>"show"}
  product PUT              {:controller=>"products", :action=>"update"}
  product DELETE           {:controller=>"products", :action=>"destroy"}
  product_photos GET       {:controller=>"photos", :action=>"index"}
  product_photos POST      {:controller=>"photos", :action=>"create"}
  new_product_photo GET    {:controller=>"photos", :action=>"new"}
  edit_product_photo GET   {:controller=>"photos", :action=>"edit"}
  product_photo GET        {:controller=>"photos", :action=>"show"}
  product_photo PUT        {:controller=>"photos", :action=>"update"}
  product_photo DELETE     {:controller=>"photos", :action=>"destroy"}
  products GET             {:controller=>"products", :action=>"index"}
  products POST            {:controller=>"products", :action=>"create"}
  new_product GET          {:controller=>"products", :action=>"new"}
  edit_product GET         {:controller=>"products", :action=>"edit"}
  product GET              {:controller=>"products", :action=>"show"}
  product PUT              {:controller=>"products", :action=>"update"}
  product DELETE           {:controller=>"products", :action=>"destroy"}
  root                     {:controller=>"products", :action=>"index"}

, что означает, что форма в products / new будет отправлять POST для продуктов # создавать, что я хочу затем перенаправить на фотографии # new и иметь форму для загрузки product_photos, созданных соответствующими фотографиями /new.html.erb, который будет POST для фотографий # создавать, верно?

в product_controller.rb:

def create
    @product = Product.new(params[:product])

    respond_to do |format|
      if @product.save
        redirect_to new_product_photo_path, :notice => 'Product was successfully created.'
      else
        render :action => "new"
      end
    end
  end

и в photos_controller.rb (на данный момент):

def new
    @photo = Photo.new
  end

Итак, почему, почему я получаю:

Routing Error

No route matches {:controller=>"photos", :action=>"new"}

когда маршруты рейка ясно говорят, что я делаю, у меня есть photos_controller, новое действие в photos_controller, и new_product_photo_path явно просит перейтиправильный путь?(У меня также есть файл photos / new.html.erb с простым <h1>Photos</h1> для чего-либо для рендеринга).

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

Кто-нибудь?

Спасибо и С наилучшими пожеланиями, Адам

1 Ответ

0 голосов
/ 23 октября 2010

Обновленный ответ:

Использование вложенного ресурса означает (в данном случае), что вы можете создать новую фотографию только в контексте продукта.Это означает, что приложение должно знать, какому продукту принадлежит создаваемая фотография.

В случае вашего перенаправления это означает, что вы должны добавить объект продукта в качестве параметра к new_product_photo_path:

redirect_to new_product_photo_path(@product)

Оригинальный ответ:

Это потому, что вы сделали его вложенным ресурсом./products/1/photos/new, вероятно, работает.Если вы хотите иметь возможность создавать новые фотографии с помощью /photos/new, вам также необходимо добавить «неотнесенный» ресурс.

...