Dans le but de réduire la duplication de code dans ma petite application Rails, j'ai travaillé pour obtenir du code commun entre mes modèles dans son propre module séparé, loin si bon.Comment écrire un mixage Rails à travers le modèle, le contrôleur et la vue
Le truc modèle est assez facile, je dois juste inclure le module au début, par exemple:
class Iso < Sale
include Shared::TracksSerialNumberExtension
include Shared::OrderLines
extend Shared::Filtered
include Sendable::Model
validates_presence_of :customer
validates_associated :lines
owned_by :customer
def initialize(params = nil)
super
self.created_at ||= Time.now.to_date
end
def after_initialize
end
order_lines :despatched
# tracks_serial_numbers :items
sendable :customer
def created_at=(date)
write_attribute(:created_at, Chronic.parse(date))
end
end
Cela fonctionne très bien, maintenant cependant, je vais avoir un code du contrôleur et vue qui va être commun entre ces modèles et, jusqu'à présent, j'ai pour mon truc expédiable:
# This is a module that is used for pages/forms that are can be "sent"
# either via fax, email, or printed.
module Sendable
module Model
def self.included(klass)
klass.extend ClassMethods
end
module ClassMethods
def sendable(class_to_send_to)
attr_accessor :fax_number,
:email_address,
:to_be_faxed,
:to_be_emailed,
:to_be_printed
@_class_sending_to ||= class_to_send_to
include InstanceMethods
end
def class_sending_to
@_class_sending_to
end
end # ClassMethods
module InstanceMethods
def after_initialize()
super
self.to_be_faxed = false
self.to_be_emailed = false
self.to_be_printed = false
target_class = self.send(self.class.class_sending_to)
if !target_class.nil?
self.fax_number = target_class.send(:fax_number)
self.email_address = target_class.send(:email_address)
end
end
end
end # Module Model
end # Module Sendable
Fondamentalement, je prévois faire juste un include :: expédiable Controller et expédiable :: Voir le (ou l'équivalent) pour le contrôleur et la vue, mais, y a-t-il une façon plus propre de faire ce? Je suis d'une manière soignée d'avoir un tas de code commun entre mon modèle, contrôleur et vue. Edit: Juste pour clarifier, cela doit juste être partagé entre 2 ou 3 modèles.
J'ai choisi cette réponse, même si Hoyhoy est aussi très bien, juste parce que ça correspond mieux à ce que je fais. – Mike
C'est vraiment la même chose. C'est une meilleure syntaxe. – hoyhoy