0

如果我们想让方法可以从流动模板中访问,我们需要像liquid_methods在我们的模型中一样声明它们,如下所示:

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

  ...

问题是我们的模型定义了很多东西(属性和公共方法),并且当我们添加新方法时,管理并且不要忘记将它们声明为liquid_methods,更不用说在我们模型的顶部。所以问题是,我想声明所有属性 getter 和公共方法都应该“流动化”,有没有比总是手动声明它们以便像示例中那样可以访问液体更花哨的方法?你会怎么做?

要在伪代码中得到这样的观点(可能不起作用):

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

  liquid_methods methods

  ...
4

1 回答 1

2

我使用液体并且有同样的问题。这是我反对您提出的解决方案的建议:

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

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

如果你有两组人(受信任的和不受信任的),那么让你信任的人使用一种类型的模板并将不受信任的人发送到 Liquid。)

如果您默认公开您的方法,那么测试您没有公开太多的方法要困难得多。

当然,您最终会得到一个丑陋的方法列表,这些方法要暴露给 Liquid 模板。但是这样一来,您就可以肯定只有这些方法被公开了。

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

HTH。

于 2011-09-18T23:44:27.660 回答