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.
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! –