如何在coffeescript js中使用Rails助手

时间:2012-07-11 04:22:42

标签: javascript ruby-on-rails coffeescript helpers

我不太明白帮助器在视图/控制器中的工作方式。我从未使用过它们。

我的具体问题是:几乎所有的观点都实现了AJAX。在我的大多数控制器中, update.js.coffee create.js.coffee 具有以下代码的某种形式:

jQuery ->
  <% if @product.errors.any? %>
  error_info = '<%= j(render :partial => "shared/errors", :locals => { :record => @product }) %>'
  popup error_info

  <% else %>
.
.
.

其中popup是一个显示某个元素的javascript函数。

有没有办法将其抽象为帮手?做这个的最好方式是什么?这个代码几乎完全相同,除了@product的2个用途当然会有所不同,具体取决于所讨论的模型。

如果这不是帮助者的用途,那么1)他们使用了什么? 2)我应该使用什么呢?

编辑:奖金问题:实际上,我的许多新功能,创建功能,编辑功能和更新功能在各个型号中都是相似的。你怎么干这个?或者你只是不担心它?

2 个答案:

答案 0 :(得分:3)

第一步是将文件的扩展名更改为.js.coffee.erb。这让资产管道知道您希望用ERB解释文件。

第二个可选步骤是向Sprokets添加自定义帮助程序,以便您可以从Coffee脚本文件中调用自己的方法*。只需创建一个新的辅助模块,然后将其注册到初始化程序中:

Sprockets::Context.send :include, CoffeeHelper

*:资产将无法访问您习惯使用的所有帮助程序,因为ERB在编译资产时运行,而不是作为HTTP请求的一部分运行。正常的控制器/辅助设置不存在。

答案 1 :(得分:0)

如果你想将这个代码重构为rails helper,就像任何其他helper方法一样,你必须将所有的javascript代码作为一个字符串,你的rails helper将需要返回一个字符串。

Rails帮助程序可以帮助您从视图中重构逻辑,这样您就可以尽可能减少代码逻辑,并允许重复代码更加干燥。

如果您发现某些代码在模型中重复出现,您还可以考虑将该代码重构为lib目录中的ruby模块,并将该模块包含在模型中。