2011-06-08 14 views
5

Uso el código de idioma como prefijo, p. Ej. www.mydomain.com/en/posts/1. Esto es lo que hice en routes.rb:¿Cómo establecer los valores predeterminados para los parámetros de los métodos de url helper?

scope ":lang" do 
    resources :posts 
end 

Ahora puede utilizar simplemente ayudantes enlace como: post_path(post.id, :lang => :en). El problema es que me gustaría utilizar un valor en una cookie como idioma predeterminado. Así que podría escribir solo post_path(post.id).

¿Hay alguna manera de establecer valores predeterminados para los parámetros en los ayudantes de url? No puedo encontrar el código fuente de los ayudantes de url. ¿Puede alguien señalarme en la dirección correcta?

Otra forma: Ya he tratado de ponerlo en routes.rb pero ha evaluado en el tiempo de inicio solamente, esto no funciona para mí:

scope ":lang", :defaults => { :lang => lambda { "en" } } do 
    resources :posts 
end 

Respuesta

3

Esta es la codificación de la cabeza, así que no hay garantía , pero le daría prueba en un inicializador:

module MyRoutingStuff 
    alias :original_url_for :url_for 
    def url_for(options = {}) 
    options[:lang] = :en unless options[:lang] # whatever code you want to set your default 
    original_url_for 
    end 
end 
ActionDispatch::Routing::UrlFor.send(:include, MyRoutingStuff) 

o recta mono-parche ...

module ActionDispatch 
    module Routing 
    module UrlFor 
     alias :original_url_for :url_for 
     def url_for(options = {}) 
     options[:lang] = :en unless options[:lang] # whatever code you want to set your default 
     original_url_for 
     end 
    end 
    end 
end 

El código para url_for está en actionpack// enrutamiento/lib url_for.rb en Rails 3.0.7

+0

Genial, no sabía que se llama url_for cada vez que se llama url helper. Gracias. –

+0

Sin embargo, hay más de un método url_for. Tuve que mover mi url_for a ApplicationController y establecerlo como helper_method; de lo contrario, no funcionó. Pero tu idea ayudó de todos modos, gracias. –

+0

el enfoque principal no funciona, ya que intenta alias un método que no existe en ese nuevo módulo –

6

Ryan Bates cubrió esto en el actual Railscast: http://railscasts.com/episodes/138-i18n-revised

Usted encontrar la fuente de url_for aquí: http://api.rubyonrails.org/classes/ActionDispatch/Routing/UrlFor.html

Verá que combina las opciones dadas con url_options, que a su vez llama a default_url_options.

Agregue lo siguiente como métodos privados a su application_controller.rb y debe estar configurado.

def locale_from_cookie 
    # retrieve the locale 
end 

def default_url_options(options = {}) 
    {:lang => locale_from_cookie} 
end 
3

doesterr anterior casi lo tiene. Esa versión de default_url_options no funcionará bien con los demás. Desea aumentar en lugar de las opciones de clobber pasadas:

def locale_from_cookie 
    # retrieve the locale 
end 

def default_url_options(options = {}) 
    options.merge(:lang => locale_from_cookie) 
end 
Cuestiones relacionadas