Ruby on rails 具有名称空间和嵌套路由的Rails路由
我有一个Ruby on rails 具有名称空间和嵌套路由的Rails路由,ruby-on-rails,routes,nested,Ruby On Rails,Routes,Nested,我有一个email\u模板模型,它有一个嵌套的资源moves,用于处理将email\u模板从一个文件夹移动到另一个文件夹的操作 但是,我想在:templates名称空间中命名这些操作,因为我还有几个其他资源也是模板项 由于我使用名称空间,我不想在URL中看到templates/email\u templates/:id,我更希望看到templates/email/:id 为了实现这一目标,我有以下几点: # routes.rb namespace :templates do resource
email\u模板
模型,它有一个嵌套的资源moves
,用于处理将email\u模板
从一个文件夹移动到另一个文件夹的操作
但是,我想在:templates
名称空间中命名这些操作,因为我还有几个其他资源也是模板项
由于我使用名称空间,我不想在URL中看到templates/email\u templates/:id
,我更希望看到templates/email/:id
为了实现这一目标,我有以下几点:
# routes.rb
namespace :templates do
resources :emails do
scope module: :emails do
resources :moves, only: [:new, :create]
end
end
end
当我对电子邮件执行CRUD操作时,一切正常,因为它们只是使用:id
参数。但是,当我使用嵌套的移动时,电子邮件的父ID总是显示为:email\u ID
,而不是:email\u template\u ID
。我确信这是Rails的预期行为,但我正在试图弄清楚父ID是如何确定的。它是来自路由中资源名称的单数,还是以某种方式从模型构建的
我想使用templates/email/:email\u id/moves/new
是可以的,但在一个完美的世界里,我更喜欢templates/email/:email\u template\u id/moves/new
,这样开发者就可以清楚地看到它是一个email\u模板
资源,而不是email
# app/controllers/templates/emails_controller.rb
module Templates
class EmailsController < ApplicationController
def show
@email_template = EmailTemplate.find(params[:id])
end
end
end
# app/controllers/templates/emails/moves_controller.rb
module Templates
module Emails
class MovesController < ApplicationController
def new
# Would prefer to reference via :email_template_id parameter
@email_template = EmailTemplate.find(params[:email_id])
end
def create
@email_template = EmailTemplate.find(params[:email_id])
# Not using strong_params here to demo code
if @email_template.update_attribute(:email_tempate_folder_id, params[:email_template][:email_template_folder_id])
redirect_to some_path
else
# errors...
end
end
end
end
end
#app/controller/templates/emails_controller.rb
模块模板
类EmailsController
您可以将参数自定义为:
resources :emails, param: :email_template_id do
...
end
您可以将参数自定义为:
resources :emails, param: :email_template_id do
...
end
当我这样做时,我会得到错误“缺少必需的密钥:[:email\u id]”,当我查看params散列时:{“param”=>:email\u template\u id,“controller”=>“templates/email/moves”,“action”=>“new”,“email\u id=>“1”}
当我这样做时,我会得到错误“缺少必需的密钥:[:email\u id]”,当我查看params散列时:{“param”=>:电子邮件模板id,“控制器”=>“模板/电子邮件/移动”,“操作”=>“新建”,“电子邮件id”=>“1”}