考虑这个例子。我的产品型号有discount_percentage
。我们正在维护多个语言环境。在视图中我们不希望i18n的东西搞砸了视图。因此,我们帮助您更好地阅读并可能在其他视图中重复使用它:render_product_discount
(代码请参见下文),它将呈现此产品的折扣状态。我们在整个应用程序中使用i18n延迟查找功能。但是当我们想测试这个辅助方法时,我们得到一个错误:
# RuntimeError:
# Cannot use t(".product_discount") shortcut because path is not available
因为没有path
可供翻译助手扩展延迟翻译密钥。
预期产量:此产品有20%的折扣。
助手名称:render_product_discount
def render_product_discount
t('.product_discount', discount_percentage: product.discount_percentage)
end
# es.yml
es:
products:
show:
product_discount: Este producto tiene un %{discount_percentage} descuento.
# en.yml
en:
products:
show:
product_discount: This product has %{discount_percentage} discount.
如何解决这个问题?提前谢谢。
答案 0 :(得分:12)
有时您可以设置所需的虚拟路径,以便translate知道如何使用快捷方式。
辅助规范
before { helper.instance_variable_set(:@virtual_path, "admin.path.form") }
现在t('.word')
查找admin.path.form.word
。
答案 1 :(得分:1)
如果你把它作为:
helper.stub(:t).with('.product_discount', discount_percentage: product.discount_percentage) { "This product has #{product.discount_percentage}% discount." }
你可以测试:
expect(helper.render_product_discount).to eq("This product has #{product.discount_percentage}% discount.")
修改强>
正如SebastianG回答的那样,您可以将@virtual_path
设置为使用预期路径,就像在主代码中一样,我认为这是一种更好的方法。