Rails 7 adds support for passing all string-like arguments
(that respond_to? #to_str) to redirect_to.
Any class that defines #to_str like the Addressable::URI class
can now be passed to redirect_to.
We can also write a custom class that defines #to_str as shown below.
Example
class GoogleSearcher
attr_reader :query
def initialize(query)
@query = query
end
def to_str
"https://www.google.com/search?q=#{query}"
end
endBefore
def saeloun_home
redirect_to "https://saeloun.com"
end
#=> No error, will work properly and redirect us to https://saeloun.com
def google_home
redirect_to Addressable::URI.parse("https://google.com")
end
#=> Raises NoMethodError
def search
redirect_to GoogleSearcher.new("Cat Pics")
end
#=> Raises NoMethodErrorIn the above example,
the google_home action will raise a NoMethodError as redirect_to
expects a string argument.
(Or a Hash,
a Record or a block that gets evaluated to a string)
Similarly,
the search action will raise a NoMethodError for the user-defined class.
After
def saeloun_home
redirect_to "https://saeloun.com"
end
#=> No error raised
def google_home
redirect_to Addressable::URI.parse("https://google.com")
end
#=> No error raised
def search
redirect_to GoogleSearcher.new("Cat Pics")
end
#=> No error raisedIn the above example,
for the google_home action,
#to_str gets internally called on Addressable::URI.parse("https://google.com").
A valid string URL is returned and, we are successfully redirected to https://google.com.
Similarly,
for the search action,
#to_str gets internally called on the GoogleSearcher class object
and
we are successfully redirected to https://www.google.com/search?q=Cat%20Pics.
