5

Esiste un posto adeguato per i metodi di supporto per i modelli in Rails? Esistono metodi di supporto per i controller e le visualizzazioni, ma non sono sicuro di dove sia il posto migliore per mettere i metodi helper del modello. A parte aggiungere un metodo a ActiveRecord::Base, che preferirei non farlo.Metodi di supporto per i modelli in Rails

UPDATE: Sembra Le preoccupazioni fanno un sacco di senso. Ecco un esempio di ciò che voglio. Alcuni modelli non possono mai essere eliminati, in modo da aggiungere un callback che genera sempre un'eccezione:

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

Con le preoccupazioni, avrei potuto fare qualcosa di simile?

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 

È questo il modo Rails di fare questo?

+3

Perché non usi il semplice vecchio modulo Ruby e lo mischi in tutte le classi che vuoi? –

+0

Che cosa significa "helper per modello"? Forse stai cercando un decoratore? –

+0

Sarebbe utile se tu dessi un esempio, penso che la gente potrebbe consigliare sulla convenzione: ci sono molti modi per fare qualsiasi cosa, ma generalmente attenersi alla convenzione è una buona idea. –

risposta

7

Se si desidera utilizzare un helper_methodmy_helper_method all'interno di una model, è possibile scrivere

ApplicationController.helpers.my_helper_method 

Se avete bisogno di flessibilità po 'di più, per esempio, se anche è necessario sostituire alcuni metodi, si può fare questo:

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 

e quindi utilizzare con

HelperProxy.instance.my_helper_method 

Se hai i nervi saldi, puoi anche provare a includere lo ApplicationController.master_helper_module direttamente nel tuo model.

tramite: post di makandracards.

Per il vostro riferimento: http://railscasts.com/episodes/132-helpers-outside-views

+1

Stavo cercando lo stesso e ho trovato la tua risposta utile nel mio caso. Grazie :) –

+0

@HetalKhunti: Felice di averlo trovato utile –

8

Se quello che stai chiedendo è dove mettere il codice che viene condiviso tra più modelli in Rails 4.2, quindi la risposta standard deve essere quello di utilizzare Preoccupazioni: How to use concerns in Rails 4

Tuttavia , ci sono alcuni buoni argomenti (ad es. this) per usare solo il modulo rails standard include e si estende come suggerisce marek-lipka.

Si consiglia vivamente di NON utilizzare i metodi di supporto ApplicationController in un modello, poiché verrà importato un sacco di bagaglio non necessario insieme ad esso. Farlo di solito è un cattivo odore secondo me, perché significa che non stai separando gli elementi MVC e c'è troppa interdipendenza nella tua app.

Se è necessario modificare un oggetto modello aggiungendo un metodo appena utilizzato in una vista, quindi dare un'occhiata ai decoratori. Per esempio https://github.com/drapergem/draper