从JavaScript js.erb文件中调用Ruby on Rails helper方法

时间:2013-09-12 08:19:53

标签: ruby-on-rails ruby

是否可以在js.erb文件中调用ruby helper方法?

我在application_helper.rb中有一个名为solve的帮助程序,它对第三方服务进行API调用,并且只有一个ruby客户端。

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

我从控制器调用JS文件

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

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

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

只是将变量设置为字符串&lt;%= solve(variable)%&gt;

我也试过

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

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

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

这可能吗?

3 个答案:

答案 0 :(得分:1)

试试这个:

var content = '#{solve()}'

答案 1 :(得分:0)

需要更多关于此问题的背景信息,但我会尽力回答:

  • 基本上,您将无法访问任何.erb文件之外的application_helper方法。 (即如果你的管道中有application.js或任何其他js文件而你正试图从那里&lt;%=解决%&gt;它将无法工作 - 主要是因为它不是.erb文件)< / LI>

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

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

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

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

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

$("#test_link").data("solve");
无论application_helper中的“solve”方法输出什么输出,

都会返回给你。

答案 2 :(得分: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