2011-11-22 20 views
28

Jeśli mam metodę w innym kontrolerze do tej, w której piszę i chcę ją nazwać, czy jest to możliwe, czy też powinienem rozważyć przeniesienie tej metody do pomocnik?Wywołanie metody z innego kontrolera

+1

Czy możesz dodać fakty do problemu, który chcesz rozwiązać, wywołując metodę innego kontrolera? Obecnie jest dość ogólnikowa, a rozwiązanie będzie zależało od problemu. – mliebelt

+0

Rzeczywiście, proszę opracuj, co próbujesz rozwiązać. co robi wspólna metoda? – nathanvda

Odpowiedz

45

Można technicznie utworzyć wystąpienie innego kontrolera i metody wywołania, ale jest on nużący, podatny na błędy i wysoce niezalecany.

Jeśli ta funkcja jest wspólna dla obu kontrolerów, prawdopodobnie powinieneś mieć ją w ApplicationController lub innym kontrolerem nadklasy swojego stworzenia.

class ApplicationController < ActionController::Base 
    def common_to_all_controllers 
    # some code 
    end 
end 

class SuperController < ApplicationController 
    def common_to_some_controllers 
    # some other code 
    end 
end 

class MyController < SuperController 
    # has access to common_to_all_controllers and common_to_some_controllers 
end 

class MyOtherController < ApplicationController 
    # has access to common_to_all_controllers only 
end 

Jeszcze innym sposobem, aby to zrobić jak jimworm sugerowane jest użycie modułu do wspólnej funkcjonalności.

# lib/common_stuff.rb 
module CommonStuff 
    def common_thing 
    # code 
    end 
end 

# app/controllers/my_controller.rb 
require 'common_stuff' 
class MyController < ApplicationController 
    include CommonStuff 
    # has access to common_thing 
end 
+5

Lub zawarte w 'module'. – jimworm

+0

'include GoodSuggestion' Thanks @jimworm – edgerunner

+1

Tworzenie instancji innego kontrolera ???? Arrrrrrrgggh (istotnie). Inna opcja, ponieważ pytanie jest tak niejasne: przenieś kod do modeli. – nathanvda

2

spróbować i stopniowo przesuwać ci metody modeli, jeśli nie stosuje się do modelu następnie pomocnika i jeśli nadal musi być dostępne gdzie indziej umieścić w ApplicationController

+1

Nigdy nie przenosiłbym kodu z kontrolera do helpera, a raczej modułu mieszkającego w '/ lib'. Tylko kod widoku powinien mieszkać w pomocniku. – nathanvda

+1

Umieszczenie czegoś w pomocniku jest krótkotrwałe. dojdziesz do punktu, w którym nie musisz wstawiać biblioteki/rzucając wszystko do modułu, też nie jest zbyt dobry. –

+1

Wolę używać modułów niż pomocników, ponieważ są one prawdziwe OO, mogę włączyć/rozszerzyć je do woli. Mogę grupować rzeczy, które mają rzeczywiste znaczenie. Pomocnicy to tylko wiadra. Zalecam używanie ich tylko do metod związanych z widokiem. Nie jestem pewien, co masz na myśli mówiąc "dojdziesz do rzeczy ...". – nathanvda

0

Jeśli wymóg ma do czynienia z niektórych operacji DB, to można napisać wspólny funkcji (metoda klasy) wewnątrz tego modelu. Funkcje zdefiniowane w modelu są dostępne dla wszystkich kontrolerów. Ale to rozwiązanie ma zastosowanie do wszystkich przypadków.

Powiązane problemy