开发者

How to add third level nav in Ruby on Rails?

开发者 https://www.devze.com 2023-04-10 01:37 出处:网络
New to ruby on rails, trying to get this url structure: /about /about/staff /about/contact /about/brazil /about/brazil/staff

New to ruby on rails, trying to get this url structure:

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

When I do:

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

I set my routes to:

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

And all is well, but I got stumped when I need to开发者_JAVA技巧 do the same for a third level for the brazil office

Should I just do

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"

Or is there a cleaner way to accomplish this?


I think you want to call this rails generate controller About index staff contact

to generate AboutController with three actions index, staff and contact. Then you want to allow passing in id parameter as the second path element:

Then in 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'

When I check routes with rake routes I see now:

$ 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"}

You can now request http://localhost:3000/about/brazil/staff and the value of params[:id] will be "brazil".


One good option for this is to seperate the routes by using a 'namespace' in your /config/routes.rb file like this:

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

If you then run rake routes, you can see the routing that results:

/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"}

So all these route to the same controller (which I believe is what you wanted), and you have only three actions: staff, index and contact. The :country value will be passed in as a parameter if it exists in the url and would be accessed as params[:country].

Is this what you were trying to do?

0

精彩评论

暂无评论...
验证码 换一张
取 消