2017-10-04 2 views
0

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 

Répondre

0

Vous pouvez personnaliser le paramètre comme:

resources :emails, param: :email_template_id do 
     ... 
end 
+0

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"} '' –