获取所有公共方法和属性getter并将它们传递给liquid_methods

时间:2011-09-18 23:29:26

标签: ruby ruby-on-rails-3 liquid

如果我们想要从液体模板中访问方法,我们需要在模型中将它们声明为liquid_methods,如下所示:

class User < ActiveRecord::Base
  liquid_methods :name, :adress, :any_method_we_want

  ...

事情是我们的模型定义了很多东西(属性和公共方法),它是一个很好的目标来管理而不是忘记当我们添加新的时候将它们声明为liquid_methods,更不用说了我们的模型顶部真的很难看。所以问题是,我想声明所有属性getter和公共方法应该是&#34;液化&#34;,是否有一种更为奇特的方式,而不是总是手动声明它们可以访问液体,如这个例子?你会怎么做?

在伪代码中得到类似的东西(可能不起作用):

class User < ActiveRecord::Base
  methods = self.public_methods + self.attribute_names

  liquid_methods methods

  ...

1 个答案:

答案 0 :(得分:2)

我使用Liquid并遇到同样的问题。以下是我对你提议的解决方案的建议:

Liquid的全部目的是不要将应用程序的数据或方法暴露给编写Liquid模板的随机用户。

(如果你只有信任的人写作模板,那么不要使用Liquid。而是使用erb,haml,dryml或其他选择。

如果您有两组人(受信任且不受信任),那么让您信任的人使用一种模板,并将不受信任的人发送给Liquid。)

如果你默认公开你的方法,那么测试你没有暴露太多就很难。

当然,您最终会得到一个丑陋的方法列表,您将这些方法暴露给Liquid模板。但是那样,你肯定只会暴露这些方法。

相反,只需添加有关应通过液体暴露的测试。然后,您将确保所需的最小值将暴露给Liquid模板。

HTH。