Вам необходимо создать шаблон URL-адреса (не обязательно сам действительный URL-адрес, но шаблон, который можно использовать для создания действительного URL-адреса). Вы точно знаете, что вам нужно заменить, вы можете быть уверены, что это произойдет только в одном месте, и вы знаете, что все в безопасности, потому что вы все контролируете, а GoogleBot знает, что он ищет (предположительно).
Я бы go заранее исправил кодировку вручную:
search_url(search: { q: "{search_term_string}" }).sub('%7Bsearch_term_string%7D', '{search_term_string}')
Если вы думаете, что шаблон будет появляться более одного раза (что маловероятно), используйте вместо этого gsub
of sub
.
Вы также можете более четко указать, что вы делаете:
.sub('%7Bsearch_term_string%7D') { |encoded| URI.decode(encoded) }
Или поместите все это в помощник (скажем, search_url_for_microdata
), чтобы вы могли оставьте себе в будущем записку о том, почему вы это делаете:
# Untangle URL encoding issues with json+ld microdata for GoogleBot.
def search_url_for_microdata
search_url(search: { q: '{search_term_string}' })
.sub('%7Bsearch_term_string%7D') { |encoded| URI.decode(encoded) }
end
или даже:
# Untangle URL encoding issues with json+ld microdata for GoogleBot.
def search_url_for_microdata
decoded = '{search_term_string}'
encoded = URI.encode(decoded)
search_url(search: { q: decoded }).sub(encoded, decoded)
end
или:
DECODED = '{search_term_string}'
ENCODED = URI.encode(DECODED)
# Untangle URL encoding issues with application/ld+json microdata for GoogleBot.
def search_url_for_microdata
search_url(search: { q: DECODED }).sub(ENCODED, DECODED)
end