Rails 视图规范:无法在命名空间视图中找到局部视图

Posted

技术标签:

【中文标题】Rails 视图规范:无法在命名空间视图中找到局部视图【英文标题】:Rails view specs: can't locate partials in namespaced views 【发布时间】:2014-04-19 00:12:20 【问题描述】:

我试图用 RSpec 进行测试。我遇到的问题之一是在 admin 命名空间中的视图测试中调用 render 时让 RSpec 定位部分。

基本上,在我看来,我有很多使用缩写语法的render 调用,如下所示:

render @products

但是,我猜是因为 RSpec 缺乏知道此视图在 admin 命名空间中的上下文,它似乎无法找到位于 app/views/admin/products/_product.html.erb 中的部分。为了让事情顺利进行,我必须执行以下操作:

render partial: 'admin/products/product', collection: @products

但是,你知道,我非常喜欢较短的语法。这是遵循 Rails 约定的重点。如果你愿意的话,作为一个好孩子并将一切都放在适当的地方的奖励。

所以,我想知道:在我的 RSpec 视图测试中是否有一种方法可以指定我正在测试某个命名空间内的视图?是否有一些金块可以让这种痛苦消失?

【问题讨论】:

【参考方案1】:

我知道这是一个老问题,但这个链接 https://github.com/rspec/rspec-rails/issues/396 可能会帮助遇到类似问题的其他人(比如我)。您可以逐个配置配置 rspec 规范查找视图部分的位置。

【讨论】:

【参考方案2】:

如果您觉得这确实是一个 RSpec 问题,请将其登录到 rspec-rails issues。根据您的一般描述,这听起来像是一个 Rails 问题。

当您在视图中使用render @products 时,这会告诉Rails 呈现partial。这与控制器操作中的 render 不同。

根据Rails docs,当你render @customer

@customer 实例变量包含 Customer 模型的实例,这将使用 _customer.html.erb 来呈现它。

这里遗漏的是_customer.html.erb 的路径。不幸的是,当前的文档让你寻找这个。在collection 信息下,是这个宝石吗:

Rails 通过查看集合中的模型名称来确定要使用的部分名称。事实上,你甚至可以创建一个异构集合并以这种方式渲染它,Rails 会为集合的每个成员选择适当的部分:

这实质上意味着,在您看来,当您执行render @customer 时,会尝试加载:app/views/customers/_customer.html.erb。不是您已经设置的命名空间。如果您希望使用命名空间,您的模型必须已经是该命名空间的一部分(即Admin::Product),或者您必须指定完整的部分路径(正如您已经发现的那样)。

【讨论】:

感谢您的回复。在 Rails 中,一切都按预期(和记录)工作。 Rails 可以毫无问题地找到要渲染的正确部分。是 RSpec 视图测试找不到正确的部分。 另外,我应该补充一点,与您的最后一段相反,您不需要需要命名您的模型来呈现命名空间部分;你必须命名你的控制器。

以上是关于Rails 视图规范:无法在命名空间视图中找到局部视图的主要内容,如果未能解决你的问题,请参考以下文章

仪表板命名空间的 Rails 路由帮助

如何在 Rails 局部视图中创建行空间?

为啥 ERB 不在 Rails 视图规范中执行?

如何避免 Rails 脚手架将模型放入命名空间

Laravel 4无法从命名空间控制器中找到BaseController

命名规范