如何在Coffeescript JS中使用Rails helpers

3
我不太了解helpers在视图/控制器中的工作方式。我从未使用过它们。
我的具体问题是:几乎所有我的视图都使用AJAX。在我的大多数控制器中,update.js.coffeecreate.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)我应该使用什么代替它们?

编辑:奖励问题:实际上,我的许多新创建、编辑和更新功能在各个模型中都很相似。如何使其更加DRY?或者你只是不用担心它?

2个回答

3
第一步是将文件扩展名更改为.js.coffee.erb。这样可以让资源管道知道您希望使用ERB解释该文件。
第二个可选步骤是向Sprokets添加自定义辅助方法,以便您可以从Coffee脚本文件中调用自己的方法*。只需创建一个新的辅助模块,然后在初始化程序中注册它即可。
Sprockets::Context.send :include, CoffeeHelper

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


0

如果您想将此代码重构为Rails助手,则可以像任何其他助手方法一样完成,您必须将所有JavaScript代码作为字符串,并且您的Rails助手需要返回一个字符串。

Rails助手可帮助将逻辑从视图中重构出来,以便您可以尽可能地保持代码无逻辑,并且它可以使重复的代码更加DRY。

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


感谢提供的信息。助手返回的字符串是JavaScript和ERB混合的吗?由于这是CoffeeScript,返回的字符串需要换行和双倍间距缩进才能正常工作吗? - Bryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接