2014-06-27 22 views
0

一个视图下执行Ruby代码,它的工作原理:从这个代码是从一个视图下执行在轨

<% @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 

它也不管用。

这两种情况似乎都有cookies的麻烦。有没有办法从视图运行OpenGraph.fetch(参数)与一些javascript variable

回答

1

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

这里的HTTP请求/响应周期的删节版:

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

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

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

1

你不能像这样容易地将JavaScript计算的东西混合到你的Ruby代码中。你可以使用类似于ExecJS的东西来从你的Ruby调用服务器端代码的Javascript代码,但那不是视图代码。它可能比它的价值更麻烦。

的选项有:

  • 计算someURL在Ruby中,当你渲染视图
  • 图出在客户端
  • 元标记建立从你的Javascript AJAX调用到你的Ruby服务器检索这些元标签。