2015-03-19 15 views
5

Czy istnieje odpowiednie miejsce dla metod pomocniczych dla modeli w Railsach? Istnieją metody pomocnicze dla kontrolerów i widoków, ale nie jestem pewien, gdzie najlepiej umieścić metody modelowania pomocnika. Oprócz dodania metody do ActiveRecord::Base, której nie chcę.Metody pomocy dla modeli w szynach

UPDATE: Wydaje się, że Obawy mają wiele sensu. Oto przykład tego, czego chcę. Niektóre modele nie mogą być usunięte, więc dodaję zwrotnego że zawsze zgłasza wyjątek:

before_destroy :nope 
def nope 
    raise 'Deleting not allowed' 
end 

z obawami, mógłby zrobić coś takiego?

class MyModel < ActiveRecord::Base 
    include Undeletable 
end 

module Undeletable 
    extend ActiveSupport::Concern 

    included do 
     before_destroy :nope 
    end 

    def nope 
     raise 'Deleting not allowed' 
    end 
end 

Czy to jest sposób Railsów?

+3

Dlaczego nie używasz zwykłego starego modułu Ruby i miksujesz go ze wszystkimi klasami, jakie chcesz? –

+0

Co oznacza "pomocnik dla modelu"? Może szukasz dekoratora? –

+0

Pomoże ci, jeśli podasz przykład, myślę, że ludzie mogą doradzić w sprawie konwencji: jest wiele sposobów na zrobienie czegokolwiek, ale generalnie trzymanie się konwencji jest dobrym pomysłem. –

Odpowiedz

7

Jeśli chcesz użyć helper_methodmy_helper_method wewnątrz model, można napisać

ApplicationController.helpers.my_helper_method 

Jeśli potrzebujesz nieco więcej elastyczności, na przykład, jeśli trzeba także przesłonić pewne metody, można zrobić to:

class HelperProxy < ActionView::Base 
    include ApplicationController.master_helper_module 

    def current_user 
    #let helpers act like we're a guest 
    nil 
    end  

    def self.instance 
    @instance ||= new 
    end 
end 

a następnie użyć z

HelperProxy.instance.my_helper_method 

Jeśli masz silne nerwy, możesz również spróbować dodać ApplicationController.master_helper_module bezpośrednio do swojego model.

przez: posta makandracards.

Dla odniesienia: http://railscasts.com/episodes/132-helpers-outside-views

+1

Szukałem tego samego i znalazłem twoją odpowiedź pomocną w moim przypadku. Dzięki :) –

+0

@HetalKhunti: Cieszę się, że znalazłeś pomocny –

8

Jeśli co prosicie to gdzie umieścić kod, który jest współdzielony przez wiele modeli w szynach 4.2, wtedy średnia odpowiedź musi być użycie dotyczy: How to use concerns in Rails 4

jednak , istnieje kilka dobrych argumentów (np. this), aby po prostu używać standardowych modułów szynowych, i rozszerza się tak, jak sugeruje marka-lipka.

Zdecydowanie nie polecam używania metod pomocniczych ApplicationController w modelu, ponieważ wraz z nim importujesz niepotrzebny bagaż. Zwykle jest to w moim odczuciu nieprzyjemny zapach, ponieważ oznacza to, że nie oddzielasz elementów MVC, a twoja aplikacja ma za dużo współzależności.

Jeśli chcesz zmodyfikować obiekt modelu, dodając metodę, która jest właśnie używana w widoku, obejrzyj dekoratory. Na przykład: https://github.com/drapergem/draper