0

这段代码是从一个视图中执行的,它可以工作:

<% @metaTags = OpenGraph.fetch('http://www.someurl.com') || nil %>
<% if @metaTags != nil %>
      postTitle = truncateStr('<%= @metaTags.title %>', 72);
<% end %>

我想做同样的事情,但http://www.someurl.com作为 javascript 计算的参数传递,就像这样

尝试 1

var someURL = ... (compute value);
setCookie("someURL", someURL, 10000);
<% @metaTags = OpenGraph.fetch(cookies[:someURL]) || nil %>
<% if @metaTags != nil %>
      postTitle = truncateStr('<%= @metaTags.title %>', 72);
<% end %>

它不起作用。

尝试 2

var someURL = ... (compute value);
setCookie("someURL", someURL, 10000);
<% readPostURL %>
<% if @metaTags != nil %>
      postTitle = truncateStr('<%= @metaTags.title %>', 72);
<% end %>

并在控制器中

private
def readPostURL
  @metaTags = OpenGraph.fetch(cookies[:postURL]) || nil
end
helper_method :readPostURL

它也不起作用。

这两种情况似乎都对 cookie 有问题。有没有办法使用一些 javascript 从视图中运行 OpenGraph.fetch(parameter) variable

4

2 回答 2

1

你不能像这样轻易地将 Javascript 计算的东西混入你的 Ruby 代码中。您可能可以使用 ExecJS 之类的东西从您的 Ruby 调用服务器端的Javascript 代码,但这不是视图代码。这可能比它的价值更麻烦。

您的选择是:

  • someURL渲染视图时在 Ruby 中计算
  • 找出客户端的元标记
  • 从您的 Javascript 向您的 Ruby 服务器进行 AJAX 调用以检索这些元标记。
于 2014-06-27T15:45:10.613 回答
1

对于不熟悉 Web 开发的有经验的开发人员来说,这是一个常见问题。由于 JavaScript 在浏览器中运行,它实际上会在 Ruby 代码完成后(相对)很长时间执行。

这是 HTTP 请求/响应周期的简化版本:

  1. 浏览器向服务器发出请求
  2. 服务器解析请求
  3. 服务器生成响应(这是运行 Ruby 代码的地方)
  4. 浏览器收到响应
  5. 浏览器呈现响应(这是您的 JavaScript 代码运行的地方)

解决方案通常非常简单:在 JavaScript 运行后发出第二个请求。对于如何根据您的特定应用程序(重定向、刷新、AJAX)发出第二个请求,您有很多选择。

至于您的实际代码,如果您想保留信息以供将来的请求使用,则 cookie 方法很好。如果您只需要一次,只需将数据粘贴到第二个请求的 URL 参数中即可。

于 2014-06-27T16:24:20.937 回答