如何生成带自定义命名空间且关联现有模型的Rails Scaffold
如何生成带自定义命名空间的Scaffold并关联现有模型/表
当然可以!你只需要在Rails scaffold生成命令中指定关联的根命名空间模型,就能避免创建新的admin_locations表,同时保留Admin命名空间下的控制器、视图和路由。
正确的生成命令
直接使用--model-name参数指定已有模型的名称,这样scaffold生成器会复用根命名空间的Location模型和对应的locations表:
rails generate scaffold Admin::Location --model-name=Location
这个命令会生成以下内容:
app/controllers/admin/locations_controller.rb:属于Admin命名空间的控制器,操作的是根命名空间的Location模型app/views/admin/locations/:对应Admin命名空间的视图文件- 路由配置中自动添加
namespace :admin do resources :locations end - 不会生成新的模型文件(因为指定了复用已有模型),也不会创建新的数据库迁移文件
生成后的小调整
生成的视图文件中,表单的form_for可能需要手动调整一下路径前缀,确保提交到Admin命名空间的路由:
原生成的代码可能是:
<%= form_for(@location) do |f| %>
需要改成:
<%= form_for([:admin, @location]) do |f| %>
这样表单会正确提交到/admin/locations相关的路由。
如果已经错误生成了Admin::Location模型
如果你之前不小心执行了不带参数的命令,生成了Admin::Location模型和admin_locations迁移,可以按以下步骤修复:
- 删除生成的模型文件:
rm app/models/admin/location.rb - 删除对应的迁移文件(在
db/migrate/目录下,文件名包含create_admin_locations) - 修改
app/controllers/admin/locations_controller.rb中的所有Admin::Location引用,替换为Location - 调整视图中的
form_for路径(如上面的步骤)
这样就能确保控制器和视图都操作已有的Location模型和locations表了。
内容的提问来源于stack exchange,提问作者Nino Treyssat-Vincent
相关产品推荐
相关产品推荐

