2015-03-19 18 views
5

Gibt es einen geeigneten Platz für Hilfsmethoden für Modelle in Rails? Es gibt Hilfsmethoden für Controller und Ansichten, aber ich bin mir nicht sicher, wo der beste Platz für Modellhelfermethoden ist. Neben dem Hinzufügen einer Methode zu ActiveRecord::Base, die ich nicht bevorzugen würde.Hilfsmethoden für Modelle in Rails

UPDATE: Es scheint, Bedenken machen viel Sinn. Hier ist ein Beispiel von dem, was ich will. Bestimmte Modelle können nie gelöscht werden, so dass ich hinzufügen, einen Rückruf, der immer eine Ausnahme auslöst:

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

Mit Sorgen, ich könnte so etwas tun?

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 

Ist dies die Rails-Methode?

+3

Warum verwenden Sie nicht einfach altes Ruby-Modul und mischen Sie es in alle Klassen, die Sie wollen? –

+0

Was bedeutet "Helfer für Modell"? Vielleicht suchst du einen Dekorateur? –

+0

Es würde helfen, wenn Sie ein Beispiel geben würden, denke ich, dann könnten Leute auf Konvention beraten: es gibt viele Möglichkeiten, etwas zu tun, aber im Allgemeinen an der Konvention zu halten ist eine gute Idee. –

Antwort

7

Wenn Sie eine helper_methodmy_helper_method in einem model verwenden möchten, können Sie schreiben

ApplicationController.helpers.my_helper_method 

Wenn Sie ein bisschen mehr Flexibilität benötigen, beispielsweise, wenn Sie auch einige Methoden außer Kraft setzen müssen, können Sie tun dies:

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 

und verwenden Sie dann mit

HelperProxy.instance.my_helper_method 

Wenn Sie starke Nerven haben, können Sie auch versuchen, die ApplicationController.master_helper_module direkt in Ihre model aufzunehmen.

über: makandracards Post.

Für Ihre Referenz: http://railscasts.com/episodes/132-helpers-outside-views

+1

Ich war auf der Suche nach dem gleichen und ich fand Ihre Antwort in meinem Fall hilfreich. Danke :) –

+0

@HetalKhunti: Freut mich zu hören, dass Sie es hilfreich fanden –

8

Wenn das, was Sie fragen, wo Code setzen, die über mehrere Modelle in Schienen 4.2, dann ist die Standardantwort geteilt wird, muss sein Anliegen zu nutzen: How to use concerns in Rails 4

jedoch Es gibt einige gute Argumente (z. B. this), um nur Standard-Schienen-Modul enthält, und erweitert, wie Marek-Lipka suggeriert.

Ich würde dringend empfehlen, die ApplicationController-Hilfsmethoden NICHT in einem Modell zu verwenden, da Sie damit viel unnötiges Gepäck importieren. Dies ist meiner Meinung nach normalerweise ein schlechter Geruch, da es bedeutet, dass Sie die MVC-Elemente nicht voneinander trennen und Ihre App zu stark voneinander abhängig ist.

Wenn Sie ein Modellobjekt ändern müssen, indem Sie eine Methode hinzufügen, die gerade in einer Ansicht verwendet wird, dann sehen Sie sich die Dekoratoren an. Zum Beispiel https://github.com/drapergem/draper

Verwandte Themen