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”}