2013-02-18 5 views
17

mam następujące modele:Railsy zagnieżdżonych zasobów i routingu - jak rozdzielić kontrolery?

  • post
  • Tag
  • TaggedPost (z którego postu i Tag czerpią swoje skojarzenia przez has_many: through)

i mam następujący routes.rb plik :

resources :tags 

resources :posts do 
    resources :tags 
end 

Kiedy więc n avigate to, powiedzmy, /posts/4/tags, które wykona akcję indeksu dla kontrolera tagów z wartością post_id ustawioną w tablicy parametrów. Chłodny.

Moje pytanie brzmi jednak, kiedy mam dostęp do zasobu tagów zagnieżdżonych pod postami, czy powinienem trafić jeszcze do kontrolera Tagów? Czy powinienem ustawić inny kontroler, aby obsłużyć zagnieżdżony charakter tagów w tym momencie? W przeciwnym razie muszę stworzyć dodatkową logikę do kontrolera tagów. Można to oczywiście zrobić, ale czy jest to powszechny sposób obsługi zagnieżdżonych tras i zasobów? Kod mam w akcji indeksu dla regulatora Tagi przedstawia się następująco:

TagsController.rb

def index 
    if params[:post_id] && @post = Post.find_by_id(params[:post_id]) 
    @tags = Post.find_by_id(params[:post_id]).tags 
    else 
    @tags = Tag.order(:name) 
    end 
    respond_to do |format| 
    format.html 
    format.json {render json: @tags.tokens(params[:q]) } 
    end 
end 

widzę kod w tym kontrolerze coraz bardziej duża, jak zaplanować wiele dodatkowych zasoby powiązane z zasobami znaczników. Myśli o tym, jak to przełamać?

Zestawienie pytań:

  1. Jeżeli zasób jest zagnieżdżony, powinien być zagnieżdżony zasób przeżywa innego kontrolera reprezentującego zagnieżdżony charakteru zasobu? Jest to sprzeczne z przechodzeniem przez normalny kontroler, tak jak ja w podanym przykładzie kodu.
  2. Jeśli tak, w jaki sposób powinny być one nazwane i skonfigurowane?

Daj mi znać, jeśli potrzebujesz więcej informacji.

Odpowiedz

4

Wszystko, co robisz z zagnieżdżonymi zasobami, zmienia adres URL routingu. Jedyne, co musisz zrobić, to upewnić się, że przekazujesz odpowiedni identyfikator (w twoim przypadku) do kontrolera tagów. Najczęstszym błędem jest identyfikator *** Can not Find.

jeśli NIE gniazdo trasa profil na trasie użytkownik będzie wyglądać następująco

domain.com/user/1

domain.com/profile/2

kiedy gniazdo trasy byłoby

domain.com/user/1/profile/2

że to wszystko, co robi. nic więcej. nie potrzebujesz dodatkowych kontrolerów. Robienie routingu zagnieżdżonego jest tylko dla wyglądu. umożliwiając użytkownikowi śledzenie powiązania. Najważniejszą rzeczą w trasach zagnieżdżania jest to, że robisz odnośnik do właściwej ścieżki.

gdy nie zagnieżdżone: byłoby user_path i profile_path

gdy jest zagnieżdżona trzeba by użyć user_profile_path.

trasa rake jest twoim przyjacielem, aby dowiedzieć się, jak zmieniły się trasy.

nadzieję, że to pomaga.

+0

To właściwie odpowiada na rdzeń mojego pytania ... Sądzę, że logistyka inna niż to naprawdę zależy od moich obsesyjno-kompulsywnych potrzeb organizacyjnych. –

+0

Proszę, ze względu na swoich przyszłych kolegów (i ty futur futurystyczny!), Przeczytaj też odpowiedź @lazel! – gfd

+0

Zdobycie kilku ciężko zarobionych punktów podczas głosowania w dół. Proszę, dodaj zagnieżdżony kontroler. – Drenmi

29

Myślę, że najlepszym rozwiązaniem jest podzielone kontrolery:

resources :tags 

    resources :posts do 
     resources :tags, controller: 'PostTagsController' 
    end 

A potem masz 3 kontrolerów. Opcjonalnie można dziedziczyć PostTagsController z TagsController zrobić coś takiego:

class PostTagsController < TagsController 
     def index 
      @tags = Post.find(params[:post_id]).tags 
      super 
     end 
    end 

Jeżeli różnica jest tylko pobieranie tagów można:

class TagsController < ApplicationController 
     def tags 
      Tag.all 
     end 

     def tag 
      tags.find params[:id] 
     end 

     def index 
      @tags = tags 
      # ... 
     end 
     # ... 
    end 

    class PostTagsController < TagsController 
     def tags 
      Product.find(params[:product_id]).tags 
     end 
    end 

Zastosowanie że metody i po prostu zastąpić tagi w dziedziczenie kontrolerów;)

+1

Ta odpowiedź jest znacznie czystsza i łatwiejsza do zrozumienia dla każdego przyszłego współpracownika IMHO. Wiem, że Railsy są związane z DRY, ale w tym przypadku OP mówi: "Planuję wiele dodatkowych zasobów do powiązania z zasobami tagów", więc pozwolenie na rozróżnienie każdego związku będzie prawdopodobnie wielką pomocą ... – gfd

+1

w opcji kontrolera teraz zamiast tego powinniśmy mieć 'post_tags'. http://guides.rubyonrails.org/routing.html#specifying-a-controller-to-use –

Powiązane problemy