【问题标题】:Call a Ruby on Rails helper method from a JavaScript js.erb file从 JavaScript js.erb 文件调用 Ruby on Rails 辅助方法
【发布时间】:2013-09-16 12:45:37
【问题描述】:

是否可以从 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) %>'

它只是将变量设置为字符串

我也试过了

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

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

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

这可能吗?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    试试这个:

    var content = '#{solve()}'
    

    【讨论】:

    • 这会将变量内容设置为字符串
    【解决方案2】:

    这是可能的,但有不同的方法可以做到这一点。一种方法是在您的控制器中定义 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

    【讨论】:

    • 我不是想从视图中调用它,而且 js 与视图没有任何关系。这都是服务器端。我需要将 js 文件中的 var 传递给 ruby​​ 方法,然后获取响应。
    • 我猜你可以在这种情况下使用 gon gem。请检查一次,虽然我从未尝试过使用 gon 的 Phantom js
    • 你能从 JS 中向 ruby​​ 方法发送一个 var,然后用 gon 得到响应吗?
    • 可以在控制器中设置一个变量,然后在js中使用gon访问该变量。请查看 git 文档。
    • 这对我没有帮助,我需要将 js 文件中的变量发送到 ruby​​ 方法,然后得到响应。我不能先在控制器中设置它
    【解决方案3】:

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

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

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

    • 如果您使用<script> //JS ERB CODE GOES HERE </script> 将要评估的 JS 内嵌在与您的 partial/html.erb 页面相同的页面上,它实际上会正确评估,因为它位于 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 中的“解决”方法产生什么输出,都会返回给您。

    【讨论】:

    • 对不起,我应该在我的问题中说。我想从 PhantomJS 文件中调用这个辅助方法。所以它与 partial/html.erb 没有任何关系
    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多