Miałem ten sam problem. Model naprawdę nie może/nie powinien wiedzieć nic o kontrolerach. Zadaniem kontrolera jest ustalenie, o jaki zasób jest żądany, oraz wywołanie modelu, aby uzyskać do niego dostęp. Jeśli Twój AdminController potrzebuje standardowego identyfikatora numerycznego, nie będziesz chciał dotknąć to_param
.
Okazuje się, że rozwiązanie jest dość proste i używam go w produkcji.
Zakładając, że masz nazwy na swoich kontrolerach, będziesz miał MyModelController i Admin :: MyModelController, wraz z ich pomocnikami. W Admin, wykonaj czynności w standardowy sposób. W MyModelController wykonaj następujące czynności:
W swoich działaniach na zasoby zapoznaj się z params[:id]
, ale traktuj je jak permalink (URL).Na przykład
def get
@my_model = MyModel.find_by_url(params[:id])
...
end
W swojej MyModelHelper
def my_model_path my_model
super my_model.url
end
def my_model_url my_model
super my_model.url
end
Dla mnie to było to był najlepszy sposób na „nie” walczyć szyn i dostać to, czego potrzebowałem zrobić.
Może być bardziej sprytny sposób na przesłonięcie nazwanych tras. Myślę też, że nie można używać tej metody z użyciem helper :all
, chyba że przed wygenerowaniem ścieżek/adresów URL sprawdzisz, czy jesteś administratorem, czy nie.
samo tutaj, nie chciałbym identyfikator w URL ponieważ chcę ściśle oddzielić wewnętrzne elementy modelu od reprezentacji zewnętrznej poprzez adres URL .. możliwe .. –
To nie spowoduje wstawienia identyfikatora w adresie URL. Wszystko, co robi, to daje kolejną metodę klasy, BlogPost.find_by_param, której używasz zamiast BlogPost.find_by_url, i działa bez względu na to, czy nadasz jej identyfikator czy adres URL. –