J'ai un modèle email_template
qui a une ressource imbriquée moves
pour gérer le déplacement d'un email_template
d'un dossier à un autre.Rails de routage avec espaces de noms et routes imbriquées
Toutefois, je souhaite nommer ces actions dans un espace de noms :templates
car plusieurs autres ressources sont également des éléments de modèle.
Puisque je suis namespacing, je ne veux pas voir templates/email_templates/:id
dans l'URL, je préférerais voir templates/emails/:id
.
Pour accomplir que je donne les résultats suivants:
# routes.rb
namespace :templates do
resources :emails do
scope module: :emails do
resources :moves, only: [:new, :create]
end
end
end
Tout fonctionne bien quand je fais des actions CRUD sur les e-mails, car ils sont juste en utilisant le paramètre :id
. Toutefois, lorsque j'utilise le moves
imbriqué, l'ID parent pour les messages électroniques continue à apparaître comme :email_id
et non :email_template_id
. Je suis sûr que c'est le comportement attendu de Rails, mais j'essaie de comprendre comment l'ID parent est déterminé. Cela vient-il du singulier du nom de la ressource dans les routes, ou est-il en train d'être construit à partir du modèle en quelque sorte?
Je pense qu'il est autorisé à utiliser templates/emails/:email_id/moves/new
, mais dans un monde parfait je préférerais templates/emails/:email_template_id/moves/new
tellement les développeurs sont clairs que c'est une ressource email_template
, pas 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
Quand je fais cela, je reçois l'erreur « manquant clés requises: [: email_id] » et quand je regarde le hachage params: '{ "param" =>: email_template_id, "controller" => "templates/emails/moves", "action" => "nouveau", "email_id" => "1"} '' –