Rails маршрутизация: как опция также меняет хэш параметров ... как это переопределить? - PullRequest
2 голосов
/ 18 марта 2012

У меня есть волосатый набор маршрутов, которые я обновляю с Rails 2 до Rails 3. В Rails 2 файл маршрутов был написан так:

map.resources :stories, :path_prefix => ':user_id', :name_prefix => 'user_', :controller => :user_stories, :do |story|
  story.resources :article_clips
end

И это произвело этот набор маршрутов:

          user_story_article_clips GET    /:user_id/stories/:story_id/article_clips(.:format)                  {:controller=>"article_clips", :action=>"index"}
                                   POST   /:user_id/stories/:story_id/article_clips(.:format)                  {:controller=>"article_clips", :action=>"create"}
       new_user_story_article_clip GET    /:user_id/stories/:story_id/article_clips/new(.:format)              {:controller=>"article_clips", :action=>"new"}
      edit_user_story_article_clip GET    /:user_id/stories/:story_id/article_clips/:id/edit(.:format)         {:controller=>"article_clips", :action=>"edit"}
           user_story_article_clip GET    /:user_id/stories/:story_id/article_clips/:id(.:format)              {:controller=>"article_clips", :action=>"show"}
                                   PUT    /:user_id/stories/:story_id/article_clips/:id(.:format)              {:controller=>"article_clips", :action=>"update"}
                                   DELETE /:user_id/stories/:story_id/article_clips/:id(.:format)              {:controller=>"article_clips", :action=>"destroy"}

Обратите внимание, что пример URL содержит: : story_id] '...

Так что мне удалось перевести это с некоторым успехом, вот что я до сих пор:

scope ":user_id" do
  resources :stories, :as => 'user_story', :controller => :user_stories do
    resources :article_clips
  end
end

Это все хорошо, кроме использования ': as', обратите внимание, как объект, который помещается в хэш params, был переименован в ': user_story_id':

          user_story_article_clips GET    /:user_id/stories/:user_story_id/article_clips(.:format)             {:action=>"index", :controller=>"article_clips"}
                                   POST   /:user_id/stories/:user_story_id/article_clips(.:format)             {:action=>"create", :controller=>"article_clips"}
       new_user_story_article_clip GET    /:user_id/stories/:user_story_id/article_clips/new(.:format)         {:action=>"new", :controller=>"article_clips"}
      edit_user_story_article_clip GET    /:user_id/stories/:user_story_id/article_clips/:id/edit(.:format)    {:action=>"edit", :controller=>"article_clips"}
           user_story_article_clip GET    /:user_id/stories/:user_story_id/article_clips/:id(.:format)         {:action=>"show", :controller=>"article_clips"}
                                   PUT    /:user_id/stories/:user_story_id/article_clips/:id(.:format)         {:action=>"update", :controller=>"article_clips"}
                                   DELETE /:user_id/stories/:user_story_id/article_clips/:id(.:format)         {:action=>"destroy", :controller=>"article_clips"}

Я пробовал много разных вещей, ': name_prefix' вообще не работает, эта вещь:: path_prefix 'также больше не работает. Как я могу сделать это? Я собираюсь написать эти маршруты вручную с помощью операторов «match»?

Большое спасибо за вашу помощь.

1 Ответ

2 голосов
/ 20 марта 2012

Я закончил писать маршруты вручную, вот так:

match '/:user_id/stories/:story_id/article_clips(.:format)'           => 'article_clips#index',   :via => :get, :as => :user_story_article_clips
match '/:user_id/stories/:story_id/article_clips(.:format)'           => 'article_clips#create',  :via => :post
match '/:user_id/stories/:story_id/article_clips/new(.:format)'       => 'article_clips#new',     :via => :get, :as => :new_user_story_article_clip
match '/:user_id/stories/:story_id/article_clips/:id/edit(.:format)'  => 'article_clips#edit',    :via => :get, :as => :edit_user_story_article_clip
match '/:user_id/stories/:story_id/article_clips/:id(.:format)'       => 'article_clips#show',    :via => :get, :as => :user_story_article_clip
match '/:user_id/stories/:story_id/article_clips/:id(.:format)'       => 'article_clips#update',  :via => :put
match '/:user_id/stories/:story_id/article_clips/:id(.:format)'       => 'article_clips#destroy', :via => :delete

Это неприятно, но это сработало для моих нужд. Помощники вида с user_prefix «user_» используются во всем приложении (я набрал 84 места), поэтому мне нужно сохранить это. Но с параметром ': user_story' - он нарушает маршрут, 'история' не может быть найдена.

Извините, если мое объяснение проблемы не очень разборчиво. Если кто-то знает более быстрое решение (если опция 'name_prefix' работала в Rails 3 так же, как в Rails 2, я думаю, что это был бы способ сделать это ...) - например, это работало, но не сейчас:

scope ":user_id" do
  resources :stories, :name_prefix => 'user_', :controller => :user_stories do
    resources :article_clips
  end
end
...