Rails: controller vs modelli che dovrebbero gestire la manipolazione dei file

5

Questo post di Jamis Buck su come mantenere i controller Rails skinny è sempre rimasto bloccato con Me. Ho un'app in cui un file zip è costituito da un file XML e alcune immagini vengono caricate e utilizzate per creare il modello (principalmente dal file xml, che punta alle immagini).

Tutto il codice che riguarda l'estrazione dei file dallo zip e il loro spostamento nella posizione appropriata vanno nel controller o nel modello?

grazie!

    
posta kreek 17.08.2011 - 21:33
fonte

2 risposte

5

Questo articolo è praticamente classico. Sì, dovresti attenersi all'architettura "Modelli grassi, magri controllori, viste stupide" a patto che i modelli abbiano senso come oggetti (e lo fanno quasi sempre).

Nel tuo caso, non sono veramente sicuro di come dovrebbe apparire il "modello" di output, ma diciamo che è una galleria. Quindi puoi creare un modello come questo:

class Gallery # no "< ActiveRecord" if don't work with database

  attr_accessor :zip_file_path, :xml, :images

  def initialize(params ={})
    @zip_file_path = params[:zip_file_path]
    @xml = nil
    @images = []
    @output = nil # model: html code, path to file...
  end

  def generate_model
    unzip_file! # populates @xml and @images
    transform_xml! # creates model into @output
    @output
  end

  def unzip_file!
    ...
  end

  def transform_xml!
    ...
  end

end

È solo un progetto approssimativo, potresti volerlo rendere più orientato alla funzione (@xml, @images = unzip_file (@zip_file_path)) ecc.

Il controllore agirà quindi da mediatore tra il modello e le visualizzazioni / utente:

class GalleriesController < ApplicationController
  def new()
    # display upload form for zip_file
  end

 def create()
   # check input here, or leave it to model validations

  @output = Gallery.new(params).generate_model
 end

end
    
risposta data 17.08.2011 - 22:08
fonte
1

Risposta semplice: Sì, come già intuisci, questo entra nel modello.

A seconda di come esattamente il contenuto dell'aspetto zip, molto probabilmente lo consegni ad un metodo di classe del modello Image, che quindi decomprime e valuta xml e crea i record del database, scarica le immagini o qualsiasi altra cosa debba essere fatta .

Nel controller non dovresti avere molto più di qualcosa di simile: (insieme a qualunque autenticazione tu debba gestire ovviamente)

Image.scan( params[:image_zip] )

Un modo alternativo sarebbe quello di scrivere una classe in modo indipendente se il modello Image gestisce questa attività se non si desidera ottenere troppo codice in questo modello singolo.

    
risposta data 17.08.2011 - 21:48
fonte

Leggi altre domande sui tag