2017-10-04 4 views
0

Ich habe ein email_template Modell, das eine verschachtelte Ressource moves hat, um das Verschieben eines email_template von einem Ordner zu einem anderen zu behandeln.Rails-Routing mit Namespaces und verschachtelten Routen

Allerdings möchte ich diese Aktionen in einem :templates Namespace Namespace, da ich mehrere andere Ressourcen, die Vorlage Elemente sowie.

Da ich Namespacing bin, möchte ich nicht templates/email_templates/:id in der URL sehen, würde ich lieber templates/emails/:id sehen.

Um zu erreichen, dass ich folgendes haben:

# routes.rb 
namespace :templates do 
    resources :emails do 
    scope module: :emails do 
     resources :moves, only: [:new, :create] 
    end 
    end 
end 

Alles funktioniert gut, wenn ich CRUD Aktionen auf die E-Mails zu tun, da sie die :id Parameter nur verwenden. Allerdings, wenn ich die verschachtelte moves verwenden, hält die Eltern-ID für die E-Mails kommen über als :email_id und nicht :email_template_id. Ich bin sicher, dass dies das erwartete Verhalten von Rails ist, aber ich versuche, herauszufinden, wie die Eltern-ID bestimmt wird. Kommt es aus dem Singular des Ressourcennamen in den Strecken, oder wobei es sich aus dem Modell irgendwie gebaut?

Ich denke, es ist in Ordnung templates/emails/:email_id/moves/new zu verwenden, aber in einer perfekten Welt würde ich templates/emails/:email_template_id/moves/new lieber nur so Entwickler klar, dass es eine email_template Ressource, kein 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 

Antwort

0

Sie könnten die Parameter anpassen, wie:

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

Wenn ich das tue, ich die Fehlermeldung "erforderlichen Schlüssel fehlt: [: email_id]" und wenn ich mir die params hash: '{ "param" =>: email_template_id, "Controller" => "templates/E-Mails/moves", "action" => "neu", "email_id" => "1"} ' –

Verwandte Themen