管理区域,(独立的命名空间)

问题描述 投票:0回答:1

先说一句,我对 Rails 很陌生,但已经有 20 年软件工程师经验了(主要是 .Net,但也有很多 JS)。

我给自己设定了一个任务,用以下内容创建超级简单的网站:

授权管理区域添加/编辑/更新“页面”(包含 Slug 和正文)。将所述页面输出给未经授权的用户。

非常简单,但涵盖了常规博客演示之外的一些基础知识。

到目前为止,三基主义位是使用生成器在命名空间区域内生成内容。

例如,我创建了一个名为页面的模型(位于 /models 中)。然后我想在 Admin 命名空间内为此执行 CRUD。

所以路线看起来像这样:

 namespace :admin do
    resources :pages, constraints: { format: :html }
  end

现在,每当我使用生成器生成控制器或视图时,它都会不断地努力寻找路线

undefined method `page_path'

这是常见错误。

我是否对这里的生成器期望过高,是否创建了一个违反 Rails 约定的命名空间区域?如何在 Rails 应用程序内构建管理区域(或只是登录区域)?

ruby-on-rails
1个回答
0
投票

您可能期望有点过高。

当模型与控制器位于同一模块中时,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 约定实际上也更像是一组幸运的猜测,而不是某种圣书。

© www.soinside.com 2019 - 2024. All rights reserved.