先说一句,我对 Rails 很陌生,但已经有 20 年软件工程师经验了(主要是 .Net,但也有很多 JS)。
我给自己设定了一个任务,用以下内容创建超级简单的网站:
授权管理区域添加/编辑/更新“页面”(包含 Slug 和正文)。将所述页面输出给未经授权的用户。
非常简单,但涵盖了常规博客演示之外的一些基础知识。
到目前为止,三基主义位是使用生成器在命名空间区域内生成内容。
例如,我创建了一个名为页面的模型(位于 /models 中)。然后我想在 Admin 命名空间内为此执行 CRUD。
所以路线看起来像这样:
namespace :admin do
resources :pages, constraints: { format: :html }
end
现在,每当我使用生成器生成控制器或视图时,它都会不断地努力寻找路线
undefined method `page_path'
这是常见错误。
我是否对这里的生成器期望过高,是否创建了一个违反 Rails 约定的命名空间区域?如何在 Rails 应用程序内构建管理区域(或只是登录区域)?
您可能期望有点过高。
当模型与控制器位于同一模块中时,Rails 生成器仅适用于命名空间资源。
例如,当您运行
rails g scaffold admin/pages
时,它将生成控制器:
class Admin::Page < ApplicationRecord
end
由于模块包含在型号名称中:
irb(main):001:0> Admin::Page.model_name
=>
#<ActiveModel::Name:0x000055caa5f6f958
@collection="admin/pages",
@element="page",
@human="Page",
@i18n_key=:"admin/page",
@klass=Admin::Page (call 'Admin::Page.connection' to establish a connection),
@name="Admin::Page",
@param_key="admin_page",
@plural="admin_pages",
@route_key="admin_pages",
@singular="admin_page",
@singular_route_key="admin_page",
@uncountable=false>
它仅适用于生成的视图/控制器,如下所示:
<%= link_to "Show this page", @admin_page %>
因为它将派生出路线辅助方法
admin_page_path
。
如果您的 Page 类位于顶层命名空间,您会得到
undefined method 'page_path'
,因为这是 Rails 作为助手派生的。解决问题就像传递数组一样简单:
<%= link_to "Show this page", [:admin, @admin_page] %>
或者显式调用路由助手:
<%= link_to "Show this page", admin_page_path(@admin_page) %>
但是代码模板还不够复杂,因此您必须在事后进行大量修复。
我是不是对这里的生成器期望太高了,是否创建了一个违反 Rails 约定的命名空间区域?
其实不然。但代码模板实际上只是用于快速原型设计,并不能完全涵盖所有可能的场景。 Rails 约定实际上也更像是一组幸运的猜测,而不是某种圣书。