Korzystanie z Rails 3, czy istnieje sposób użycia pomocnika link_to lub jakiegokolwiek pomocnika w tym zakresie, wewnątrz modelu?Zobacz pomocnika link_to w klasie modelu
Odpowiedz
Istnieje kilka powodów, dla których możesz potrzebować łącza w modelu. Tak, @andy, to naruszenie MVC, ale to nie znaczy, że powinieneś zdobyć punkty za brak odpowiedzi na pytanie.
@schwabsauce, to łatwiejsze. Pierwsza linia nie jest nawet absolutnie konieczna, jeśli robisz to w inicjatorze lub czymś podobnym. To samo działa dla .sanitize i .raw i całego ładunku innych niesamowitych funkcji.
ActionView::Base.send(:include, Rails.application.routes.url_helpers)
ActionController::Base.helpers.link_to(whatever)
Jeśli chcesz użyć autopaths może trzeba to zrobić wewnątrz link_to:
Rails.application.routes.url_helpers.page_path(@page)
Nie bez hackery.
Jeśli uważasz, że potrzebujesz modelu link_to
, najprawdopodobniej naruszysz zasadę Model-View-Controller architecture.
Model powinien być miejscem dla danych i logiki biznesowej, ale generowanie linków prawie na pewno jest zadaniem kontrolera lub widoku (lub, w szczególności Railsów, w klasie pomocnika).
Dziękuję. Przeniesiono rzeczy, aby wyświetlić pomocnika. Wszystko pasuje teraz. – Krule
Istnieją dobre powody, aby używać pomocników w modelach. Ale bardziej do rzeczy, jeśli masz zamiar zaoferować opinię, przynajmniej zaoferuj rozwiązanie na wypadek, gdyby się zastanowili. Możliwe, że ktoś z 2k rep ma głowę na prostej. –
Dostałem to do pracy z następującymi inkluzji:
include ActionView::Helpers::UrlHelper
include ActionController::UrlFor
include Rails.application.routes.url_helpers
cattr_accessor :controller
def controller; self.class.controller; end
def request; controller.request; end
Wtedy w moim kontrolera I zaludnionych atrybut (tworzenie kontrolera od podstaw wymaga znacznych ilości danych w argumentach hash).
Lead.controller = self
fwiw, Dokumentacja Rails prowadzi do tego rozwiązania. Dokumenty ActionDispatch :: Routing :: UrlFor wskazują, że "Wskazówka: jeśli potrzebujesz generować adresy URL ze swoich modeli lub w innym miejscu, to ActionController :: UrlFor jest tym, czego szukasz." Następnie, gdy podasz ten plik, wyświetli się komunikat o błędzie: raise "Aby użyć #url_for, musisz wyraźnie włączyć obsługę routingu." "Na przykład" include Rails.application.routes.url_helpers " Myślę, że to jest dopuszczalne przez konwencje Railsowe - czasami jest to najlepszy sposób/najlepsze miejsce do wygenerowania linku :) – schwabsauce
Tak, na przykład, jeśli twój model obsługuje autoryzację płatności dla strony trzeciej, bramy zewnętrznej i musi generować adresy URL zwracanych/anulowanych wróć do aplikacji. – hoffmanc
Bądź bardzo ostrożny po poradę przedstawionym na stanowisku Chucka jeśli robisz to w Rails 3.2. 1. Wydaje się, że takie podejście nie jest bezpiecznym sposobem obejścia problemu, włączając pomocnika link_to w klasach bez widoku w Railsach 3.2.1. Istnieje bezpieczniejsza metoda (która działa dla nas w każdym przypadku) opisana poniżej.
Kiedy użyliśmy podejścia na stanowisku Chucka w jednej z naszych lekcji, okazało się, że bardzo kłopotliwe i trudne do usunięcia są konsekwencje. W efekcie pojawiły się efekty uboczne/błędy, które pojawiały się tylko w bardzo specyficznych (i rzadkich) okolicznościach.
Problem, o ile możemy powiedzieć, że jest to linia:
ActionView::Base.send(:include, Rails.application.routes.url_helpers)
mówi ActionView::Base
włączenie Rails.application.routes.url_helpers
, który ActionView::Base
widocznie już robi na własną rękę. Posiadanie go po raz drugi, wydaje się powodować ponowną inicjalizację stanu tras (@_routes w klasach, które zawierały moduł ActionDispatch :: Routing :: UrlFor).
Prowadzi to do pozornie przypadkowe i niewyjaśnione „niezdefiniowana metoda«url_for»do zera: NilClass” wyjątków w widokach, które starają się połączyć, bezpośrednio lub pośrednio, metoda url_for poActionView::Base
włączyło url_helpers
po raz drugi.
Rozwiązaniem, które działało dla nas, było zamiast powiedzieć ActionView::Base
, aby ponownie dodać url_helpers
, wystarczy sam moduł UrlHelper
, gdziekolwiek go potrzebujesz.
Wtedy, gdy trzeba użyć link_to i mieć dostęp do ścieżki można po prostu zrobić to (zakładając login_path jest ważna dla aplikacji):
include ActionView::Helpers::UrlHelper
...
link = link_to('here', Rails.application.routes.url_helpers.login_path)
Zajęło nam to bardzo dużo czasu i sporo drapania głowy w celu wyśledzenia błędów spowodowanych przez podwójne włączenie i po prostu chciałem ostrzec innych, aby zachowali ostrożność podczas modyfikowania zachowania klas bazowych Rails.
Dziękujemy za udostępnienie! Cieszę się, że znalazłeś lepszy sposób! –
Jedna linijka: 'include ActionView :: Helpers :: UrlHelper' – karlingen
@karlingen - pomijanie odniesienia do' Rails.application.routes ... 'może prowadzić do wiadomości" argumenty przekazane do url_for nie mogą być obsługiwane. wymagają tras lub zapewniają własną implementację " – Del
link_to pomocnika, MVC naruszenie
Co powiedział Andy,
jeśli jesteś generowania kodu HTML w modelu prawdopodobnie trzeba zrobić duży długie spojrzenie na to, co robisz i dlaczego.
URL pomocnicy
URL z drugiej strony często się przydać zewnątrz kodu widok-kontroler, we wszystkich rodzajach usług/form/api/... Klasy Na przykład, nawet jeśli was w modelach musieć.
Tak, Rails.application.routes.url_helpers to moduł, ale to nie znaczy, należy po prostu umieścić go gdziekolwiek lub śmieszne rzeczy rozpocznie się dzieje, jak Gary umieścić go:
https://www.destroyallsoftware.com/blog/2011/one-base-class-to-rule-them-all
Co można zrobić to:
delegate :url_helpers, :to => 'Rails.application.routes'
a następnie użyć, na przykład
url_helpers.home_url
- 1. Szyny 3 Zobacz metodę pomocnika w Modelu
- 2. w link_to pomocnika z bloku
- 3. Dodaj klasę css do szyn link_to pomocnika
- 4. Rails - link_to pomocnika z teleinformatyczny * atrybut
- 5. Umieszczanie obrazu i tekstu wewnątrz pomocnika link_to (Rails)?
- 6. Joomla: wywołanie funkcji pomocnika z poziomu modelu?
- 7. backbone.js Zobacz, który atrybut modelu się zmienia
- 8. Sprawdza powiązanie w klasie potomnej modelu
- 9. Jak has_secure_password działa w mojej klasie modelu?
- 10. Najlepszy sposób użycia ServiceManager w klasie modelu?
- 11. link_to z docelowymi pustym
- 12. Jak uzyskać dostęp do pomocnika route_path w modelu Rails 3?
- 13. Jak przekazać parametr do działania kontrolera z widoku w szynach za pomocą pomocnika link_to
- 14. Korzystanie z turbolinks w Rails link_to
- 15. link_to() w Rails migać
- 16. Jak nazwać pomocnika od pomocnika w Codeigniter?
- 17. Bootstrap Active Tab w Rails Zobacz
- 18. Railsy i haml, jak dodać id i selektory klasy do pomocnika link_to?
- 19. CodeIgniter: Spróbuj Catch nie działa w klasie modelu
- 20. Złożenie użyciu link_to w szynach
- 21. wyłączyć link_to tag w Rails3 +
- 22. Wywołanie pomocnika bloku kierownicy innego pomocnika
- 23. Podnoszenie kręgosłupa.js Zobacz wydarzenie
- 24. Haml: link_to vs button_to
- 25. szyny link_to: zdalnego
- 26. Szyny link_to metody:: usuwanie
- 27. MVC3: nie można pobrać metadanych dla mojej klasie modelu gdy chcę accesse danych modelu z kontrolerem
- 28. Zobacz Podsumowanie sprawdzania poprawności w kontrolerze
- 29. użyj pomocnika cakeph w kontrolerze
- 30. Wywołanie klasy pomocnika w Magento
To pytanie zostało zadane przed chwilą iw tej chwili rady @ andy pomogły mi rozwiązać ten problem. Masz jednak rację, nie odpowiadając na faktyczne pytanie. – Krule