Я пытаюсь разобраться в маршрутизации для многонационального интернет-магазина, присутствующего только в определенных странах. Каждый магазин отличается и имеет свой каталог товаров, а также есть магазин по всему миру для всех других стран. Я настроил Nginx для добавления двухбуквенного кода страны к поиску IP-адреса пользователя, чтобы мое приложение Rails могло определить, в какое хранилище направить посетителя. Затем я использую превосходный фильтр маршрутизации Свена Фуча , чтобы захватить этот код, выполнить поиск по глобальному объекту SHOPS, и если совпадение найдено, то используется код страны, в противном случае они получают значение по умолчанию (во всем мире ) хранить. Мой фильтр маршрутизации в настоящее время выглядит так:
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
Теперь любопытно, что коллекция params не содержит параметр: shop при выполнении метода around_generate. Мой код напрямую основан на фильтре разбиения на страницы, включенном в гем фильтра маршрутизации (я не использую фильтр локали, поскольку каждое из этих хранилищ также многоязычно - i18n обрабатывается с использованием заголовка accept-language). Оригинальный фильтр пагинации от Sven Fuchs выглядит так:
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
В моем фильтре shop = params.delete (: shop) приводит к ошибке объекта Nil, и я могу видеть из «put params», что его действительно нет. У кого-нибудь есть какие-либо предложения относительно того, почему я не могу сохранить и получить параметр: shop?
Редактировать: Я должен упомянуть, что я проверил, что параметр правильно установлен в around_recognize - здесь «put» коллекции params действительно содержит правильный объект: shop.