热在 <%= search_url 中添加 { 或 } 符号到头部

Hot to add { or } symbols in <%= search_url into the head

在我们的结构化数据区域(在 <head> 中)我们有这个

"potentialAction": {
    "@type": "SearchAction",
    "target": "<%= search_url(search: {q: "{search_term_string}" }) %>",
    "query-input": "required name=search_term_string"
}

观看"target"。它以这种方式向我显示 link

它告诉我 https://www.mywebsite.com/search?utf8=%E2%9C%93&search%5Bq%5D=%7Bsearch_term_string%7D

它不显示 { 或 },但显示 %7B 和 %7D

怎么怎么解决?

我已经尝试使用

进行修复

"{search_term_string}".html_safe

"&#123;search_term_string&#125;".html_safe

%({search_term_string})

%(&#123;search_term_string&#125;).html_safe

但什么都没有

您需要生成 URL 的模板(不一定是有效的 URL 本身,而是可用于生成有效的 URL 的模板)。您确切地知道您需要更换什么,您可以非常确定它只会发生在一个地方,并且您知道一切都是安全的,因为您是一切的控制者并且 GoogleBot 知道它在寻找什么(大概)。

我会继续手动修补编码:

search_url(search: { q: "{search_term_string}" }).sub('%7Bsearch_term_string%7D', '{search_term_string}')

如果您认为该模式会多次出现(这种可能性很小),请使用 gsub 而不是 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