Dzieńdobrywieczór,
Jestem mcv, bawię się Rails od niecałego roku i używam Archlinuksa.
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ć?
- 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.
- 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:
- Jak byście rozwiązali ten problem?
- Gdzie powinienem wsadzić moduły (ww. module ThreadController, ThreadModule, ThreadCo?) w hierarchii katalogów?
std::pzdr();