Редактировать во вложенных маршрутах без путей - PullRequest
1 голос
/ 10 ноября 2011

Использование: Rails 3.1.1 и Friendly_id для URL.

Я думаю, что это должно быть довольно легко, но я не могу понять это.

У меня есть вложенный маршрут, который выглядит следующим образом:

  resources :pages, :path => '' do
    # WHAT_DO_I_TYPE_HERE
    resources :products, :except => [:index], :path => '' do
        member do
            post 'broken_link'
        end
    end    
  end

Где безымянная (#) строка - та, которую я пытаюсь выяснить. В основном у меня есть URL, которые выглядят так:

domain.com / page_name / product_name / (через friendly_id's), например, domain.com/music/mp3/.

Я хочу использовать url domain.com/music/edit для редактирования страницы о музыке.

Теперь, если я наберу: а. <blank> # т.е. ничего ... оставьте эту строку пустой --- Я получаю сообщение об ошибке «Не могу найти продукт с id = edit», что имеет смысл. Он пытается найти продукт с именем edit, а не метод edit. Так что вместо этого я пытаюсь б. соответствует 'edit',: controller => 'pages',: action => 'edit' --- которая выдает мне ошибку «Не удалось найти страницу без идентификатора», что, я думаю, также имеет смысл.

Так что же мне написать, чтобы указать маршруты для проверки метода редактирования перед проверкой названия продукта?

1 Ответ

0 голосов
/ 03 марта 2012

У меня была эта проблема раньше ... Есть несколько вещей, которые вы можете сделать, чтобы добиться желаемой маршрутизации URL ...

Во-первых, с имеющимся у вас кодом я бы посоветовал взглянуть на то, что rake routes в командной строке производит для всего, что связано с путями page_path или page_product / product_page, и посмотреть, какие URL-адреса он перехватывает + их именованные маршруты.

Если это не совсем то, что вы хотите .. тогда вы можете попробовать:

get '/:id' => 'products#show'

вместо вашего # WHAT_DO_I_TYPE_HERE

Хотя, возможно, вам придется наложить ограничение на это (см. Ссылки внизу), чтобы у вас все еще могли быть свои /mypage/edit и mypage/new и т. Д. *

Что вы действительно хотите сделать, это настроить маршрут, который выглядит следующим образом:

match '/:page_id/:id' => 'products#show', :as => 'product'

Это должно идти где-то выше этих маршрутов и будет доступно через product_show_path. Предполагается, что вы используете стандарт отношения / принадлежит.

Вы можете переименовать часть :as => 'product' на любую, какую захотите,

Например: :as => 'public_product'

Затем обновите ваши ссылки, чтобы показывать public_products_path, где это необходимо

В ваших продуктах # show action вы должны выполнить:

@product = Product.find(:id => params[:id], :page_id => params[:page_id])

вы также можете посмотреть, как накладывать ограничения на маршруты ... Я собрал Gist для своей справки, которая может быть вам полезна. https://gist.github.com/1908782

Кроме того, я натолкнулся на этот ответ на другой вопрос, который может вам тоже помочь ... https://stackoverflow.com/a/5443829/308701

Надеюсь, это чем-то поможет: D

...