Rails 3 Routing Resources с пространством имен переменных - PullRequest
2 голосов
/ 14 декабря 2010

Возможно ли иметь переменное пространство имен?У меня есть полезные ресурсы, такие как:

resources :articles
resources :persons

Но мне нужно поместить их в пространство имен переменных, чтобы оно отвечало на URL-адреса в форме:

':edition/:controller/:action/:id' 

, например:

/foobar/article/edit/123 или /bazbam/person/edit/345

для каждого из ресурсов.Возможно ли это с помощью метода resources, или я должен сделать это вручную?Я не буду знать возможные значения для :edition раньше времени;они просматриваются в before_filter в моем ApplicationController.

Это все, что мне нужно сделать?

scope ':edition' do
  resources :articles
  resources :matches
  resources :teams
end

ОБНОВЛЕНИЕ: При использовании вышеуказанной директивы scopeЯ получаю маршруты, как я хочу:

    articles GET    /:edition/articles(.:format)          {:action=>"index", :controller=>"articles"}
             POST   /:edition/articles(.:format)          {:action=>"create", :controller=>"articles"}
 new_article GET    /:edition/articles/new(.:format)      {:action=>"new", :controller=>"articles"}
edit_article GET    /:edition/articles/:id/edit(.:format) {:action=>"edit", :controller=>"articles"}
     article GET    /:edition/articles/:id(.:format)      {:action=>"show", :controller=>"articles"}
             PUT    /:edition/articles/:id(.:format)      {:action=>"update", :controller=>"articles"}
             DELETE /:edition/articles/:id(.:format)      {:action=>"destroy", :controller=>"articles"}
     matches GET    /:edition/matches(.:format)           {:action=>"index", :controller=>"matches"}
             POST   /:edition/matches(.:format)           {:action=>"create", :controller=>"matches"}
   new_match GET    /:edition/matches/new(.:format)       {:action=>"new", :controller=>"matches"}
  edit_match GET    /:edition/matches/:id/edit(.:format)  {:action=>"edit", :controller=>"matches"}
       match GET    /:edition/matches/:id(.:format)       {:action=>"show", :controller=>"matches"}
             PUT    /:edition/matches/:id(.:format)       {:action=>"update", :controller=>"matches"}
             DELETE /:edition/matches/:id(.:format)       {:action=>"destroy", :controller=>"matches"}
       teams GET    /:edition/teams(.:format)             {:action=>"index", :controller=>"teams"}
             POST   /:edition/teams(.:format)             {:action=>"create", :controller=>"teams"}
    new_team GET    /:edition/teams/new(.:format)         {:action=>"new", :controller=>"teams"}
   edit_team GET    /:edition/teams/:id/edit(.:format)    {:action=>"edit", :controller=>"teams"}
        team GET    /:edition/teams/:id(.:format)         {:action=>"show", :controller=>"teams"}
             PUT    /:edition/teams/:id(.:format)         {:action=>"update", :controller=>"teams"}
             DELETE /:edition/teams/:id(.:format)         {:action=>"destroy", :controller=>"teams"}

Теперь я могу ссылаться на :edition в моем ApplicationController:

class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :authenticate_user!
  before_filter :get_edition

  def get_edition
    @edition = Edition.first(:conditions => { :FriendlyName => params[:edition] } )
  end

end

Теперь я просто хочу сделатьуверен, что это лучший способ сделать это.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2010

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

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

0 голосов
/ 14 декабря 2010

На самом деле, вы можете просто сделать следующее:

my_var = "persons"
resources my_var.to_sym

Метод to_sym в строке заменяет его на символ

...