2015-02-14 10 views
7

W mojej aplikacji szynowej mam model zespołów. Mój plik route.rb zespołów wygląda następująco:pomocnik ścieżki szyn nie został rozpoznany w modelu

resources :teams 

W moim teams_controller.rb złożyć linię team_path(Team.first.id) działa jednak pomocnik team_path url nie są ujmowane w moim modelu team.rb. I ten komunikat o błędzie:

undefined local variable or method `team_path' for # <Class:0x00000101705e98> 
from /usr/local/rvm/gems/ruby-1.9.3-p392/gems/activerecord-4.1.1/lib/active_record/dynamic_matchers.rb:26:in `method_missing' 

Muszę znaleźć sposób na model rozpoznać pomocnika team_path ścieżki.

+1

Chyba trzeba unikać używania pomocników w swoich modelach. Pomocnicy są przydatni w widokach i kontrolerach. W każdym razie, jaki jest komunikat o błędzie i jak dokładnie zamierzasz korzystać z pomocy? –

+0

Zwykle są pomocne w widokach i kontrolerach, ale w tym konkretnym przypadku potrzebuję pomocnika ścieżki w moim modelu. Otrzymuję ten błąd 'niezdefiniowana zmienna lokalna lub metoda' team_path 'dla # z /usr/local/rvm/gems/ruby-1.9.3-p392/gems/activerecord-4.1.1/lib/active_record /dynamic_matchers.rb:26:in 'method_missing'' – user3266824

Odpowiedz

12

powinien być w stanie wywołać url_helpers ten sposób:

Rails.application.routes.url_helpers.team_path(Team.first.id) 
+2

Z pewnością nie jest to "The Rails Way"." –

+1

Jest absolutnie w porządku, aby modele były odpowiedzialne za znajomość ich własnej lokalizacji, tj. Adresu URL. Jest to podwójnie prawdziwe w przypadku modeli związanych z CMS, takich jak" Strona "," Artykuł "itp., Ale jest w porządku dla każdego modelu z adresem URL, który je zna. –

+0

Dziękuję za to Eliotowi, odroczę się do twojej dobrej oceny i odpowiednio zredaguję odpowiedź. – trosborn

-1

Modele nie powinny zajmować się takimi ścieżkami, przekierowaniami ani żadną z tych rzeczy. Te rzeczy są wyłącznie konstrukcjami widoku lub kontrolera.

Model naprawdę powinien być właśnie taki; model rzeczy, którą tworzysz. Powinno to w pełni opisać tę rzecz, pozwolić jej znaleźć jej instancje, wprowadzić w niej zmiany, dokonać walidacji ... Ale ten model nie miałby pojęcia, jaką ścieżkę należy zastosować do czegokolwiek, nawet do samej siebie.

Powszechnym powiedzeniem w świecie Railsów jest to, że jeśli trudno jest coś zrobić (np. Wywołać pomocnika ścieżki z modelu), robisz to niesłusznie. Rozumiem, że nawet jeśli coś jest możliwe, jeśli jest to trudne w Railsach, prawdopodobnie nie jest to najlepszy sposób na zrobienie tego.

+1

Próbuję przechowywać wiele ścieżek różnych zespołów w ciągu JSON wraz z innymi atrybutami zespołu i je renderować do etykietki narzędziowej, gdy pewien element html jest zawieszony na . Więc nie jest to typowa sytuacja przekierowania. Zrobiłem metodę w moim modelu, która tworzy ten łańcuch JSON ze wszystkimi moimi atrybutami. Łącze jest czymś, o czym właśnie pomyślałem i nie jestem pewien, jak zaimplementować tę logikę w kontrolerze, nie umieszczając w sterowniku zbyt dużej logiki. Najrozsądniej jest po prostu wziąć to do modelu. – user3266824

+0

Nie rozumiem pochmurnych słów. Mam dość torów zachęcających do złych praktyk. – Papipo

7

rozważyć rozwiązania tego as suggested in the Rails API docs for ActionDispatch::Routing::UrlFor:

# This generates, among other things, the method <tt>users_path</tt>. By default, 
# this method is accessible from your controllers, views and mailers. If you need 
# to access this auto-generated method from other places (such as a model), then 
# you can do that by including Rails.application.routes.url_helpers in your class: 
# 
# class User < ActiveRecord::Base 
#  include Rails.application.routes.url_helpers 
# 
#  def base_uri 
#  user_path(self) 
#  end 
# end 
# 
# User.find(1).base_uri # => "https://stackoverflow.com/users/1" 

W przypadku Team modelu z pytaniem, spróbuj tego:

# app/models/team.rb 
class Team < ActiveRecord::Base 
    include Rails.application.routes.url_helpers 

    def base_uri 
    team_path(self) 
    end 
end 

Oto alternatywna technika, którą preferuję, ponieważ dodaje ona mniej metod do modelu.

Unikaj include i używać url_helpers od obiektu routes zamiast:

class Team < ActiveRecord::Base 

    delegate :url_helpers, to: 'Rails.application.routes' 

    def base_uri 
    url_helpers.team_path(self) 
    end 
end 
Powiązane problemy