在Rails中转义#link_to,Twitter分享链接

时间:2015-11-17 03:57:43

标签: ruby-on-rails ruby-on-rails-4 twitter escaping link-to

我试图使用Rails link_to方法动态地在Twitter共享链接中包含锚定文章链接:

<%= link_to "http://twitter.com/home?status=Check Out #{article.title} link.com/#{article.title.parameterize}" do %>
  <span class="fa fa-twitter-square fa-2x"></span>
<% end %>

Twitter链接共享内容输出到:

  

查看文章标题link.com/ARTICLE-TITLE。

问题是我想在ARTICLE-TITLE之前添加一个#字符,因为它是我视图中的锚链接。我似乎无法让#正确逃脱。这甚至可能吗?

2 个答案:

答案 0 :(得分:0)

%23 =#(在Twitter共享链接中)。

离。 link.com/%23#{article.title.parameterize}

看起来它被渲染为标签(#thattookwaytoolongtofigureout #ihopethishelpssomeone)

答案 1 :(得分:0)

一般情况下,当您需要执行诸如将URL放入另一个URL的查询参数之类的内容时,使用字符串连接(尤其是)构建URL是一个坏主意。

要创建正确编码的查询参数,请使用Rails的方便Hash#to_query方法。

让我们从内到外。

# Build the article URL
article_base_url = 'http://example.com/path'
article_url_hash = article.title.parameterize # => "my-article"
article_url = "#{article_base_url}##{article_url_hash}"
# => "http://example.com/path#my-article"

# Next, build the query string for the tweet URL
tweet_url_query = {
  status: "Check out #{article.title} #{article_url}"
}.to_query
# => "status=Check%20out%20My%20Article%20http%3A%2F%2Fexample.com%2Fpath%23my-article"

# Finally, build the tweet URL:
base_tweet_url = 'https://twitter.com/home'
tweet_url = "#{base_tweet_url}?#{tweet_url_query}"
# => "https://twitter.com/home?status=Check%20out%20My%20Article%20http%3A%2F%2Fexample.com%2Fpath%23my-article"
<%= link_to tweet_url do %>
  <span class="fa fa-twitter-square fa-2x"></span>
<% end %>

或许你已经猜到了,最好把这一切都放在帮手中:

ARTICLE_BASE_URL = 'http://example.com/'
TWEET_BASE_URL = 'http://twitter.com/home'

def tweet_url(title) 
  query = { status: tweet_text(title) }.to_query
  "#{TWEET_BASE_URL}?#{query}"
end

def tweet_text(title)
  "Check out #{title} #{article_url(title)}"
end

def article_url(title)
  "#{ARTICLE_BASE_URL}##{title.parameterize}"
end
 
<%= link_to tweet_url(article.title) do %>
  <span class="fa fa-twitter-square fa-2x"></span>
<% end %>

(当然,你可以以牺牲可读性和可测试性为代价将上述内容减少为单个两行助手,但这将是一个错误。)