2010-12-20 24 views
5

estoy usando esta guía: http://edgeguides.rubyonrails.org/i18n.htmlRuby on Rails Rutas con variantes regionales

Lo que me gustaría:

/about va a pages#about con la configuración regional en default de en.

/en/about va a pages#about con la configuración regional de en.

/es/about va a pages#about con la configuración regional de es.

lo que me pasa:

/about va a root_path con la configuración regional de about.

/en/about va a pages#about con la configuración regional de en.

/es/about va a pages#about con la configuración regional de es.

Aquí hay un código:

# config/routes.rb 
match '/:locale' => 'pages#news' 

scope "(:locale)", :locale => /en|es/ do 
    match '/abcd' => 'pages#abcd' 
    match '/plan' => 'pages#plan' 
    match '/about' => 'pages#about' 
    match '/history' => 'pages#history' 
    match '/projects' => 'pages#projects' 
    match '/donate' => 'pages#donate' 
    match '/opportunities' => 'pages#opportunities' 
    match '/board' => 'pages#board' 
end 

root :to => "pages#news" 

# app/controller/application_controller.rb 
before_filter :set_locale 

def set_locale 
    # if params[:locale] is nil then I18n.default_locale will be used 
    I18n.locale = params[:locale] 
end 

def default_url_options(options={}) 
    { :locale => I18n.locale } 
end 

Si estoy leyendo la guía correctamente, sección 2.5 dice que yo debería ser capaz de acceder /about y hacer que cargue la configuración regional predeterminada.

de 2,5:

# config/routes.rb 
scope "(:locale)", :locale => /en|nl/ do 
    resources :books 
end 

Con este enfoque no se obtendrá un error enrutamiento cuando se accede a sus recursos como http://localhost:3001/books sin un local . Esto es útil cuando desea utilizar la configuración regional predeterminada cuando no está especificado.

Respuesta

6

La primera línea en su routes.rb es un cajón de sastre ruta

match '/:locale' => 'pages#news' 

Debe ser la última línea del archivo, justo después de la ruta raíz.

+0

¡Oh! Ahora entiendo. ¡Gracias! Eso funciona perfectamente. – tinifni

4

La otra forma es:

Possible_locales = /en|es/ 

match '/:locale' => 'pages#news', :locale => Possible_locales 

scope "(:locale)", :locale => Possible_locales do 
    ... 
end 

No hay necesidad de preocuparse por orden rutas.

+0

¡Gracias! Es bueno saber qué otras opciones tengo para configurar rutas. – tinifni

1

Esta entrada de blog explica que en realidad en gran detalle (carriles 4):

Justo lo que estaba buscando cuando nada parece funcionar

http://dhampik.com/blog/rails-routes-tricks-with-locales

scope "/:locale", locale: /#{I18n.available_locales.join("|")}/ do 
    resources :posts  
    root to: "main#index" 
    end 

    root to: redirect("/#{I18n.default_locale}", status: 302), as: :redirected_root 

    get "/*path", to: redirect("/#{I18n.default_locale}/%{path}", status: 302), constraints: {path: /(?!(#{I18n.available_locales.join("|")})\/).*/}, format: false 

vuelve a dirigir a los valores predeterminados lang desde la raíz y hace muchas otras cosas también.