Я работаю реализовать тщеславия URL-адреса на основе учебника здесь: https://wesleyluyten.com/writing/vanity-urls-for-multiple-controllers-in-railsКак использовать RoutingError ActionController :: RoutingError
Чтобы сделать тщеславия URL, работать мне нужно использовать стойку маршрутизатор следующим образом:
class SlugRouter
def self.to(action)
new(action)
end
def initialize(action)
@action = action
end
def call(env)
params = env['action_dispatch.request.path_parameters']
params[:action] = @action
sluggable = Slug.where('lower(url) = ?', params[:slug].downcase).first
model = sluggable.try(:sluggable_type)
raise ActionController::RoutingError.new('Not Found') if !model
controller = [model.pluralize.camelize,'Controller'].join
params[:controller] = model.pluralize.downcase
controller.constantize.action(params[:action]).call(env)
end
end
Проблема заключается в raise ActionController::RoutingError.new('Not Found') if !model
, это не изящно обрабатывает ошибки маршрутизации. Как я могу корректно обрабатывать ошибки маршрутизации путем перенаправления к корневому ва флэш сообщение против того, что происходит сейчас Рельсы показывает страницу ошибки ш
ActionController::RoutingError (Not Found):
lib/slug_router.rb:14:in `call'
возможно внутри класса, который не унаследован от 'ActionController :: Base'? – rony36
попробуйте альтернативное решение, которое я разместил – emaillenin
Я пробовал решение alt. Это предотвратило сообщение об ошибке rails, но в итоге загрузило индекс с неправильным URL-адресом, что вызовет головную боль SEO. Как я могу заставить его просто перенаправить на URL-адрес, например '/' или '/ 404' для целей seo ... спасибо – AnApprentice