2010-11-12 7 views
1

J'essaie de trier le routage pour un magasin en ligne multinationale qui a seulement une présence dans certains pays. Chaque magasin est différent et possède un catalogue de produits différent et il existe également un magasin dans le monde entier pour tous les autres pays. J'ai configuré Nginx pour préfixer le code de pays à deux lettres d'une recherche de l'adresse IP de l'utilisateur afin que mon application Rails puisse déterminer dans quel magasin diriger le visiteur. J'utilise ensuite Sven Fuch's excellent routing-filter pour capturer ce code, faire une recherche sur un objet SHOPS global et si une correspondance est trouvée, le code de pays est utilisé, sinon ils obtiennent le magasin par défaut (mondial). Mon filtre de routage ressemble actuellement à ceci:Rails routage-filtre, paramètres non présents

module RoutingFilter 
    class Country < Filter 

    countries_pattern ||= %r(^/(?i)([a-zA-Z]{2})(?=/|$)) 

    def around_recognize(path, env, &block) 
     country = "#{extract_segment!(countries_pattern, path)}".upcase 
     yield(path, env).tap do |params| 
     params[:shop] = SHOPS.fetch(country.to_sym) || DEFAULT_SHOP 
     end 
    end 

    def around_generate(params, &block) 
     puts params 
     shop = params.delete(:shop) 
     yield.tap do |result| 
     prepend_segment!(result, shop[:country_code]) if shop 
     end 
    end 
    end 
end 

Maintenant, la chose curieuse est, la collection params ne contient pas: magasin lorsque la méthode param around_generate est exécutée. Mon code est directement basé sur le filtre de pagination inclus avec la gemme de filtre de routage (je n'utilise pas le filtre de locale car chacun de ces magasins est aussi multilingue - i18n est géré en utilisant l'en-tête accept-language à la place). Le filtre de mise en page originale Sven Fuchs ressemble à ceci:

module RoutingFilter 
    class Pagination < Filter 
    PAGINATION_SEGMENT = %r(/page/([\d]+)/?$) 

    def around_recognize(path, env, &block) 
     page = extract_segment!(PAGINATION_SEGMENT, path) 
     yield(path, env).tap do |params| 
     params[:page] = page.to_i if page 
     end 
    end 

    def around_generate(params, &block) 
     page = params.delete(:page) 
     yield.tap do |result| 
     append_segment!(result, "page/#{page}") if append_page?(page) 
     end 
    end 

    protected 

     def append_page?(page) 
     page && page.to_i != 1 
     end 
    end 
end 

Dans mon filtre, boutique = params.delete (: boutique) entraîne une erreur d'objet Nil et je peux voir de « puts params » qu'il est en effet pas présent. Quelqu'un at-il des suggestions sur les raisons pour lesquelles je suis incapable de stocker et de récupérer le paramètre: shop? Editer: Je dois préciser que j'ai vérifié que le paramètre est correctement défini dans around_recognize - un "puts" de la collection params contient en effet le bon objet shop.

Répondre

3

Si vous ne transmettez pas un: shop param à url_for (ou à toute autre aide de génération d'url que vous utilisez ici), il ne sera pas non plus transmis à around_generate. around_generate entoure la partie de génération d'URL du système de routage.

Le filtre de pagination suppose la même chose, par ex. ça s'appellerait comme blog_posts_path (: page => 2).

Mais peut-être que ce n'est pas ce que vous voulez. Si vous jetez un coup d'oeil sur le filtre Locale, cela suppose que vous passez parfois une locale à l'aide url, mais parfois vous ne le faites pas. Si: locale n'est pas donné, il le recherchera à partir de I18n.locale qui est l'environnement local actuel pour cette requête. Peut-être que vous voulez quelque chose de similaire ici?

Vous pouvez également consulter les options default_url_options du contrôleur. IIRC vous pouvez définir une option par défaut ici aussi, alors peut-être que cela pourrait fonctionner pour vous. Je n'utilise pas cette approche n'importe où, alors je ne fais que deviner.

HTH

+0

Ah, c'est tout à fait logique! J'ai ajouté ceci au contrôleur d'application: def default_url_options (* args) {: shop => params [: shop]} fin et les choses semblent fonctionner comme je le veux maintenant. Merci pour la réponse rapide! –

Questions connexes