w mojej aplikacji, mam model "użytkownika". Każdy użytkownik może mieć wiele adresów (email), które są zdefiniowane w modelu „Adres”:Jeden kontroler, różne widoki dla zwykłych użytkowników i administratorów
Class User < ActiveRecord::Base
has_many :addresses
def is_authorized(op)
# returns true or false
end
def is_owned_by(user)
# returns true or false
end
end
Class Address < ActiveRecord::Base
belongs_to :user
end
Wewnątrz klasy AddressController, aktualnie zalogowanego użytkownika jest dostępny w „@user” zmiennej instancji. Sterownik uniemożliwia zwykłym użytkownikom edytowanie, usuwanie, przeglądanie itp. Adresów, które nie należą do nich - ale zezwala użytkownikowi administracyjnemu na ich edycję. Klasa AddressController może zwrócić się do AddressModel, jeśli aktualnie zalogowany użytkownik wykonuje operacje normalne lub superuser.
Wszystko działa ładnie, a aktualizacje bazy danych są wykonywane zgodnie z oczekiwaniami, jednak chciałbym mieć różne widoki HTML w zależności od trybu działania. Mogę myśleć tylko dwa sposoby, aby to osiągnąć:
- Bądź tryb pracy (normalny/uprzywilejowane), znany w klasie AddressController (przy użyciu zmiennej instancji, np @privileged) i używać „if” w widok.
- Użyj czegoś w stylu "after_filter" w kontrolerze adresu, aby wyświetlić inny układ.
Jeśli możliwe jest wyświetlanie wyników wykonywania pojedynczego kontrolera w dwóch całkowicie różnych układach, w zależności od jego trybu działania, jaki jest dobry sposób na osiągnięcie tego?
góry dzięki Stefana
Dziękuję. Ale wydaje się, że jeśli to zrobię, zostawię ścieżkę "konwencji ponad konfigurację". Trochę się martwię - to moja pierwsza aplikacja Railsowa - czy powinienem już odejść od tego, co wszyscy inni robią? – cite
Cóż, prawdopodobnie konwencją jest przedstawienie jednego spojrzenia na działanie, ale widzę, do czego dążysz. Jeśli szukasz tylko różnych układów, rozwiązanie Staelen jest dobre. Jeśli naprawdę chcesz renderować różne widoki w zależności od logiki w akcji, nie jestem pewien, czy jest wystarczająco blisko podstawowej konwencji, aby uciec od określania widoku, który chcesz renderować. – Shadwell
Myślę, że spróbuję rozwiązania Staelena dla układu i twojego dla szablonu, który ma być renderowany. Dzięki jeszcze raz. – cite