Components

Dzieńdobrywieczór,

Jestem mcv, bawię się Rails od niecałego roku i używam Archlinuksa. :wink:

Do rzeczy: dajmy na to, że mam modele Comment i Commentable (has_many :comments). Commentable to jakby odpowiednik wątku (teee, co ja piłem, że to Commentable nazwałem, a nie Thread? OMG!).

Zmiana terminologii: mam modele Comment i Thread. Chciałbym wątki komentarzy wykorzystać w wielu miejscach, np. przy artykułach (których nie ma w moim serwisie, ale to przykład), albumach, artystach (uch, zdradzam się). Taki Album, Article, Artist miał by klucz obcy do Thread. Ale tak w ogóle rozchodzi mi się o obsługę tegoż, modele na bok.

Otóż chciałbym na stronie Artykułu, Artysty, Albumu dać partiala, nazwijmy to ‘comment_form’. Który to partial przekazywał by parametr np ‘comment’ (tablica) i wywoływał (action=’’) moją upragnioną akcję, a nie jakąś tam swoją, ze swojego kontrolera. Krótko mówiąc chcę „osadzić” ten formularz i wyniki działania akcji również „osadzić” na tej samej stronie (Artykułu, Artysty, Albumu):

class ArticlesController < ApplicationController def show # Obsługa formularza (może był wysłany, a może nie?) @comment_form = render_component_as_string :controller => Thread, :action => add_comment, :layout => false # :layout => false i tak nie działa… # Obsługa wyświetlania artykułu … end end
A w widoku w odpowienim miejscu wsadzić zawartość @comment_form.

Chciałbym komponentami, lecz nie powinienem. Więc jak to zrobić?

  1. Mógłbym wsadzić obsługę komentarzy do ApplicationController (i wtedy wywoływać metody normalnie, albo np. z before_filter), lecz to jest złe podejście, bo będzie bałagan — odpada.
  2. Mógłbym zrobić moduł Thread (module ThreadController), a w wybranych kontrolerach (Articles, Album, Artist) go zainkludować. W widokach użyć render_partial na odpowiednim partialu i odpowiednimi :locals.

Póki co skłaniam się ku drugiemu rozwiązaniu (bo na inne nie wpadłem).

Pytania są dwa:

  1. Jak byście rozwiązali ten problem?
  2. Gdzie powinienem wsadzić moduły (ww. module ThreadController, ThreadModule, ThreadCo?) w hierarchii katalogów?

std::pzdr();

Nie wiem czy dobrze zrozumialem, ale jesli tak to swietnei kombinujesz, dla komentarzy jeden model i jeden kontroler. Luknij na plugin acts_as_commentable. Dopisz do tego kontroler i juz. Wydaje mi sie ze nie potrzebujesz modelu Thread

Jeżeli dobrze zrozumiałem problem, to chyba najlepiej użyć polymorphic association.

PS: Razem ze mną, mamy już co najmniej dwóch użytkowników Archlinuksa na tym forum. :slight_smile:

Hej,

Ściągłem plugin acts_as_commentable i zajrzałem w kod. Tam też właśnie odkryłem :polymorphic => true o czym przed chwilą nieco doczytałem. Faktycznie, to jest świetne i nieomieszkam z tego skorzystać i w moich komentarzach i w innych miejscach. :wink:

Ale tak w ogóle to mnie chodziło o to jak współdzielić kod „kontrolerowy” między kilkoma kontrolerami, który jest na tyle specyficzny (kilka akcji związanych z jednym modelem), że nie chcę go pchać do ApplicationController.

Anyway, dzięki za odpowiedzi. :^)

Mysle ze dobre bylo by wrzucenie tych metod w modul i umieszczenie w katalogu lib, nastepnie includowanie tego do ApplicationController albo do poszczegolnych kontrolerow

To wręcz książkowy przypadek kiedy warto zastosować dziedziczenie:

[code=ruby]class WspolneAkcjeController < ApplicationController
end

class CosBardziejSpecyficznego1Controller < WspolneAkcjeController
end

class CosBardziejSpecyficznego2Controller < WspolneAkcjeController
end[/code]
Upewnij się jednak, czy nie lepiej byłoby cześć logiki przepchać do modelu.