首页 > 解决方案 > 将 <%= search_url 中的 { 或 } 符号添加到头部

问题描述

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

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

观看“目标”。它以这种方式向我显示链接

它告诉我 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

但没有

标签: ruby-on-railsruby-on-rails-4

解决方案


您需要生成 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

推荐阅读