Rails: controllers vs models que devem manipular a manipulação de arquivos

5

Esse post de Jamis Buck sobre manter os controllers do Rails sempre presos comigo. Eu tenho um aplicativo em que um arquivo zip consiste em um arquivo XML e algumas imagens são carregadas e usadas para criar o modelo (principalmente do arquivo xml, que aponta para as imagens).

Todo o código que lida com extrair os arquivos do zip e movê-los para o local apropriado vai no controlador ou no modelo?

obrigado!

    
por kreek 17.08.2011 / 21:33
fonte

2 respostas

5

Esse artigo é praticamente clássico. Sim, você deve se ater à arquitetura "modelos gordos, controladores magros, vistas estúpidas", desde que os modelos tenham sentido como objetos (e quase sempre).

No seu caso, não tenho certeza de como o "modelo" de saída deve parecer, mas digamos que seja uma galeria. Então você pode criar um modelo como este:

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

É apenas um design simples, você pode querer torná-lo mais orientado a funções (@xml, @images = unzip_file (@zip_file_path)) etc.

O controlador então atuará apenas como um mediador entre modelo e visualizações / usuário:

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
    
por 17.08.2011 / 22:08
fonte
1

Resposta simples: Sim, como você já adivinhou, isso entra no modelo.

Dependendo de como exatamente o conteúdo do zip se parece, você provavelmente o entrega a um método de classe do modelo Image, que descompacta e avalia o xml an cria os registros do banco de dados, faz o download das imagens ou o que precisa ser feito .

No controlador você não deve ter muito mais do que algo como: (junto com qualquer autenticação que você precise controlar, é claro)

Image.scan( params[:image_zip] )

Uma maneira alternativa seria escrever uma classe de forma independente, se o modelo de imagem para lidar com essa tarefa, se você não quiser obter muito código para este modelo único.

    
por 17.08.2011 / 21:48
fonte