Как добавить навигацию третьего уровня в Ruby on Rails? - PullRequest
1 голос
/ 01 октября 2011

Впервые в ruby ​​на рельсах, пытаясь получить структуру URL:

/about
/about/staff
/about/contact
/about/brazil
/about/brazil/staff
/about/brazil/contact

Когда я делаю:

rails generate controller about index
rails generate controller about staff
rails generate controller about contact

Я установил свои маршруты на:

get "about", :to => "about#index"
get "about/staff", :to => "about#staff"
get "about/contact", :to => "about#contact"

И все хорошо, но я был озадачен, когда мне нужно сделать то же самое для третьего уровня для офиса в Бразилии

Должен ли я просто сделать

rails generate controller about brazil_index
rails generate controller about brazil_staff
rails generate controller about brazil_contact

get "about/brazil", :to => "about#brazil_index"
get "about/brazil/staff", :to => "about#brazil_staff"
get "about/brazil/contact", :to => "about#brazil_contact"

Или есть более чистый способ сделать это?

Ответы [ 2 ]

1 голос
/ 01 октября 2011

Один хороший вариант для этого - разделить маршруты, используя «пространство имен» в вашем файле /config/routes.rb, например:

namespace :about do
  match '/' => 'about#index'
  match '/staff' => 'about#staff'
  match '/contact' => 'about#contact'
  match '/:country/staff' => 'about#staff'
  match '/:country/contact' => 'about#contact'
end

Если вы затем запустите rake routes, вы увидите маршрут, который в результате:

/about(.:format)                  {:controller=>"about/about", :action=>"index"}
/about/staff(.:format)            {:controller=>"about/about", :action=>"staff"}
/about/contact(.:format)          {:controller=>"about/about", :action=>"contact"}
/about/:country/staff(.:format)   {:controller=>"about/about", :action=>"staff"}
/about/:country/contact(.:format) {:controller=>"about/about", :action=>"contact"}

Итак, все эти маршруты ведут к одному и тому же контроллеру (что, я считаю, то, что вы хотели), и у вас есть только три действия: staff, index и contact. Значение :country будет передано как параметр, если оно существует в URL-адресе и будет доступно как params[:country].

Это то, что вы пытались сделать?

1 голос
/ 01 октября 2011

Я думаю, что вы хотите назвать это rails generate controller About index staff contact

, чтобы сгенерировать AboutController с тремя действиями index, staff и contact.Затем вы хотите разрешить передачу параметра id в качестве второго элемента пути:

Затем в config/routes.rb:

  get "about/index"
  get "about/staff"
  get "about/contact"
  get "about/:id/index" => 'about#index'
  get "about/:id/staff" => 'about#staff'
  get "about/:id/contact" => 'about#contact'

Когда я проверяю маршруты с rake routes, я вижу теперь:

$ rake routes
  about_index GET /about/index(.:format)       {:controller=>"about", :action=>"index"}
  about_staff GET /about/staff(.:format)       {:controller=>"about", :action=>"staff"}
about_contact GET /about/contact(.:format)     {:controller=>"about", :action=>"contact"}
              GET /about/:id/index(.:format)   {:controller=>"about", :action=>"index"}
              GET /about/:id/staff(.:format)   {:controller=>"about", :action=>"staff"}
              GET /about/:id/contact(.:format) {:controller=>"about", :action=>"contact"}

Теперь вы можете запросить http://localhost:3000/about/brazil/staff, и значение params [: id] будет равно "brazil".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...