Mam kilka metod kontrolera, którymi chciałbym się podzielić. Jaka jest najlepsza praktyka, aby to zrobić w Ruby on Rails? Czy powinienem utworzyć klasę abstrakcyjną, którą rozszerzają moje kontrolery, czy powinienem utworzyć moduł i dodać go do każdego kontrolera? Poniżej znajdują się metody kontrolera, które chcę udostępnić:
def driving_directions
@address_to = params[:address_to]
@address_from = params[:address_from]
@map_center = params[:map_center_start]
# if we were not given a center point to start our map on
# let's create one.
if !@map_center && @address_to
@map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_to).ll
elsif !@map_center && @address_from
@map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_from).ll
end
end
def printer_friendly
starting_point = params[:starting_point].split(',').collect{|e|e.to_f}
ne = params[:ne].split(',').collect{|e|e.to_f}
sw = params[:sw].split(',').collect{|e|e.to_f}
size = params[:size].split(',').collect{|e|e.to_f}
address = params[:address]
@markers = retrieve_points(ne,sw,size,false)
@map = initialize_map([[sw[0],sw[1]],[ne[0],ne[1]]],[starting_point[0],starting_point[1]],false,@markers,true)
@address_string = address
end
ruby-on-rails
ruby
Kyle Boon
źródło
źródło
Odpowiedzi:
Moim zdaniem obowiązują normalne zasady projektowania obiektowego:
Maps
i uzyskaj dostęp do metod takich jak:Maps::driving_directions
.class MapController < ApplicationController
) i umieść tam wspólny kod.W twoim przypadku metody wymagają state (
params
), więc wybór zależy od logicznej relacji między kontrolerami, które tego potrzebują. Dodatkowo:Również:
źródło
Wiem, że to pytanie zostało zadane 6 lat temu. Chcę tylko zaznaczyć, że w Railsach 4 są teraz problemy z kontrolerami, które są bardziej nieszablonowym rozwiązaniem.
źródło
Właściwie myślę, że moduł to najlepszy sposób na udostępnianie kodu kontrolerom. Pomocnicy są dobrzy, jeśli chcesz udostępniać kod między widokami. Helpery to w zasadzie gloryfikowane moduły, więc jeśli nie potrzebujesz dostępu do poziomu widoku, sugeruję umieszczenie modułu w folderze lib.
Po utworzeniu modułu będziesz musiał użyć instrukcji include, aby dołączyć go do żądanych kontrolerów.
http://www.rubyist.net/~slagell/ruby/modules.html
źródło
Zgadzam się z podejściem modułowym. Utwórz osobny plik Ruby w swoim katalogu lib i umieść moduł w nowym pliku.
Najbardziej oczywistym sposobem byłoby dodanie metod do ApplicationController, ale jestem pewien, że już to wiesz.
źródło
jeśli chcesz udostępniać kody między kontrolerem a pomocnikami, powinieneś spróbować utworzyć moduł w bibliotece. Możesz użyć @template i @controller, aby uzyskać dostęp do metody w kontrolerze i pomocniku. Sprawdź to, aby uzyskać więcej informacji http://www.shanison.com/?p=305
źródło
Inna możliwość:
Jeśli twój wspólny kod wymaga stanu i chcesz podzielić zachowanie między kontrolerami, możesz umieścić go w zwykłej starej klasie ruby w swoim katalogu
model
lublib
. Pamiętaj, żemodel
klasy nie muszą być trwałe, mimo że wszystkie klasy ActiveRecord są trwałe. Innymi słowy, dopuszczalne sąmodel
klasy przejściowe .źródło
Odkryłem, że skutecznym sposobem udostępniania identycznego kodu między kontrolerami jest posiadanie jednego kontrolera dziedziczącego po drugim (gdzie kod żyje). Użyłem tego podejścia, aby udostępnić identyczne metody zdefiniowane w moich kontrolerach z innym zestawem kontrolerów w przestrzeni nazw.
źródło