On Rails 3, I'm trying to redirect from a URL without a trailing slash to the canonical URL that has a slash.
match "/test", :to => redirect("/test/")
However, the route above matches both /test and /test/ causing a redirect loop.
How do I make it match only the version without the slash?
You can force the redirect at the controller level.
# File: app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
protected
def force_trailing_slash
redirect_to request.original_url + '/' unless request.original_url.match(/\/$/)
end
end
# File: app/controllers/test_controller.rb
class TestController < ApplicationController
before_filter :force_trailing_slash, only: 'test' # The magic
# GET /test/
def test
# ...
end
end
I wanted to do the same to have a cannonical url for a blog, this works
match 'post/:year/:title', :to => redirect {|env, params| "/post/#{params[:year]}/#{params[:title]}/" }, :constraints => lambda {|r| !r.original_fullpath.end_with?('/')}
match 'post/:year/:title(/*file_path)' => 'posts#show', :as => :post, :format => false
then I have another rule which deals with the relative paths inside the post. Order is important, so former goes first and generic one goes second.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With