3

是否可以从 js.erb 文件中调用 ruby​​ 辅助方法?

我在 application_helper.rb 中有一个助手,solve它调用第三方服务的 API,他们只有一个 ruby​​ 客户端。

js.erb 文件没有在客户端运行,而是从控制器方法中调用并运行服务器端,因为它是 PhantomJS。

我从控制器调用 JS 文件

Phantomjs.run('phantom.js.erb', url)

然后在我尝试过的 PhantomJS js.erb 文件中

var response = '<%= solve(variable) %>'

它只是将变量设置为字符串 <%= solve(variable) %>

我也试过

var response = <%= solve(variable) %>

但这似乎会使应用程序挂起并变得无响应。

我见过其他类似的问题。在这些问题中,他们询问是否可以从客户端 JS 调用它,我知道您需要使用 ajax 请求来调用它。

这可能吗?

4

3 回答 3

1

尝试这个:

var content = '#{solve()}'
于 2013-09-12T08:37:20.510 回答
0

这个问题需要更多背景信息,但我会尽力回答:

  • 本质上,您将无法访问任何 .erb 文件之外的 application_helper 方法。(即,如果您的管道中有 application.js 或任何其他 js 文件,并且您试图从那里 <%= solve %> 它将不起作用 - 主要是因为它不是 .erb 文件)

有很多方法和架构可以解决这个问题,但这里有两个简单的:

  • 如果您将要评估的 JS 放在与您的 partial/html.erb 页面相同的页面上,使用<script> //JS ERB CODE GOES HERE </script>它实际上会正确评估,因为它位于 erb 文件内。然而,这通常被认为是不洁的......

您可能想要做的是传递您想要的值(大概)来自它影响的 html 元素的“数据”属性中的“解决”application_helper。通过以这种方式使用“unobtrusive javascript”,您只需通过标记传递值,然后在您的 JS 中,您可以使用这样的 jQuery 代码获取变量。这是一个例子:

<%= link_to "test_link", root_path, :data => {:solve => solve } %>

当然它不一定是一个链接,任何 HTML 元素都可以,然后在你的 jQuery 中:

$("#test_link").data("solve");

application_helper 中“解决”方法的任何输出都会返回给您。

于 2013-09-12T08:30:46.750 回答
0

有可能,但有不同的方法可以做到。一种方法是在您的控制器中定义 helper_method 中的方法并从您的视图中调用它。另一种方法是使用 gon gem 访问 javascript 中的某些控制器值。请检查最适合您的方法 请检查以下链接以获得更多帮助

http://apidock.com/rails/ActionController/Helpers/ClassMethods/helper_method https://github.com/gazay/gon http://railscasts.com/episodes/324-passing-data-to-javascript

于 2013-09-12T08:35:08.370 回答