1 model -> 3 kategorie -> 3 kontrolery?

Witajcie,

Doradźcie, proszę, jak zorganizować aplikację.

Mam 3 kategorie dokumentów, które nie różnią się modelem danych, a tylko pewnymi pozycjami słownikowymi, specyficznymi dla każdej kategorii.
Różne kategorie dokumentów są “obsługiwane” przez różnych użytkowników, zatem chcę mieć w menu:

  • Dokumenty Kategorii A,
  • Dokumenty Kategorii B,
  • Dokumenty Kategorii C,

po wybraniu których de facto będzie nakładany filtr

scope :only_cat_a, -> { where(category: "A") }
scope :only_cat_b, -> { where(category: "B") }
scope :only_cat_c, -> { where(category: "C") }

Chciałbym jednak, by User, który wybierze przykładową pozycję w menu “Dokumenty Kategorii A” nie pitolił się już później w określanie kategorii przy operacjach “new” i by odpowiednia zawartość słowników pojawiała się na formularzach.

Podpowiedzcie proszę, czy dobrym pomysłem jest stworzenie 3 kontrolerów (i odpowiednich ścieżek w route.rb), w których będę wywoływał ten sam formularz z odpowiednim parametrem locals …coś w stylu:

def new
  ...
  respond_to do |format|
    format.html { render :new, locals: { category: "A"} }
  end    
end

lub nawet

kontroler A

def new
  ...
  respond_to do |format|
    format.html { render :new_form_a }
  
  end    
end

kontroler B

def new
  ...
  respond_to do |format|
    format.html { render :new_form_b }
  
  end    
end

czy lepszym jest jeden kontroler i przekazywanie dodatkowego parametru w ścieżce wywołania … coś w stylu:

/documents?category=A
/documents/new?category=A

a później przesyłanie tego parametru do formularzy i z formularzy do kontrolera i w zależności od wartości parametru dobieranie odpowiednich słowników?

Drugi sposób wydaje się prostszy w implementacji, ale czy jest elegancki, poprawny i bezpieczny?
Podpowiedzcie, proszę, którą drogę wybrać.

Czy znasz temat metaprogramowania? http://ruby-metaprogramming.rubylearning.com/ i http://tiny.pl/gx18q

Jeśli kontrolery będą się różnic niewiele można zastosować właśnie metaprogramowanie. Kod w większości się pokryje więc napiszesz go raz zamiast 3. Wydaje mi się, że będzie to jedno z lepiej wyglądających rozwiązać. Polecam szczególnie odwiedzić 2 link i zakupić tą książkę.

Wygląda na to, że jest to idealny pomysł na rozwiązanie mojego problemu.

Dzięki za podpowiedź … Idę się uczyć :smile:

Powodzenia.

Poczytałem chwilkę i zastanawiam się jednak, czy nie jest to jednak strzelanie z armaty do muchy.

Rozwiązanie na pewno profesjonalne, ale czy w moim przykładzie nie będzie łatwiej coś pożonglować zakresami i parametrami?

Zrób tylko jeden kontroler. Dodaj do URLa scope, który będzie definiował kategorię.

scope ':category', constraints: { category: /[abc]/ } do
  resources :documents
end

Pozostanie tylko kwestia ustalenia domyślnego zachowania. Możesz dodać sobie również ścieżki akcji tego kontrolera dla dokumentów poza scope i wtedy w kontrolerze przy braku parametru :category ustalać domyślny. Można też jawnie zmusić użytkownika, aby świadomie wybrał daną kategorię wcześniej. To bardziej kwestia użytkowa, aniżeli programistyczna.

Dzięki za radę.

To rozwiązanie jest chyba bardziej na moim poziomie wiedzy i wydaje się prostym panaceum na moje bolączki :smile:

Dzięki!