Pergunta

Eu tenho usado o Apptment_fu em um projeto há muito tempo e tudo estava bem, mas agora, enquanto estou tentando trazer o projeto para o Rails 2.3.3, estou encontrando um bug estranho que está me deixando louco. O anexo, um logotipo neste caso, valida corretamente no Create, mas não falha na validação na atualização. Eu depurei e falha no Validate Intial, mas parece não lançar uma exceção ou pelo menos não uma que seja capturada pelo meu resgate no controlador. Parece que eu tentei de tudo, mas não consigo descobrir isso.

Controlador:

  # POST /tournaments
  # POST /tournaments.xml
  def create
    # Build tournament
    @tournament = Tournament.new(params[:tournament].merge(:user_id => current_user.id) )

    # Save the uploaded attachments
    params[:uploads].each do |upload|
      @tournament.documents << Document.new({:uploaded_data => upload[:document]}.merge(:description => upload[:description]))
    end unless params[:uploads].nil?

    # if supplied save an event logo
    @logo = Logo.new({:uploaded_data => params[:logo][:upload_data]}) unless params[:logo].nil? or params[:logo][:upload_data].blank?  
    @tournament.logo = @logo unless @logo.nil?     

    respond_to do |format|
      begin
        Tournament.transaction do    
          @tournament.logo.save! unless @tournament.logo.nil?
          @tournament.save!  
        end
        flash[:notice] = 'Tournament was successfully created.'
        format.html { redirect_to tournament_url(@tournament) }
        format.xml  { head :created, :location => tournament_url(@tournament) }        
      rescue 
          flash[:notice] = 'Errors prevented your Tournament from being saved'
        format.html { render :action => "new" }
        format.xml  { render :xml => @tournament.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /tournaments/1
  # PUT /tournaments/1.xml
  def update
    @tournament = Tournament.find(params[:id])
    @tournament.user_id = session[:orig_user_id]

    respond_to do |format|
      begin
        Tournament.transaction do   
          # Update Logo if necessary
          unless params[:logo][:upload_data].blank?
            @tournament.logo.destroy unless @tournament.logo.nil?
            @tournament.logo = Logo.new({:uploaded_data => params[:logo][:upload_data]}.merge(:user_id => current_user.id)) 
          end   
          # Save any uploaded documents
          params[:uploads].each do |upload|
            @tournament.documents << Document.new({:uploaded_data => upload[:document]}.merge(:description => upload[:description]))
          end unless params[:uploads].nil?   
          # Update Tournamnet Attributes
          @tournament.attributes = params[:tournament]  
          # Save the Tournament
          @tournament.save!         
        end
        flash[:notice] = 'Tournament was successfully updated.' 
        format.html { redirect_to tournament_url(@tournament) }
        format.xml  { head :ok, :location => tournament_url(@tournament) }        
      rescue 
          flash[:notice] = 'Errors prevented your Tournament from being updated' 
        format.html { render :action => "edit" }
        format.xml  { render :xml => @tournament.errors, :status => :unprocessable_entity }
      end
    end
  end  

Modelo de logotipo:

    class Logo < Asset    

  validate_on_create :attachment_valid? 

  has_attachment :content_type => :image, 
    :storage => :file_system, 
    :max_size => 4.megabytes,
    :resize_to => '810x150>',  
    :processor  => :ImageScience,
    :thumbnails => { :thumb => '270x50>'  }  


  def attachment_valid? 
    content_type = attachment_options[:content_type] 
    unless content_type.nil? || content_type.include?(self.content_type) 
      errors.add(:upload_data, " * must be an image file (jpg, gif, or png)")  
    end 
    size = attachment_options[:size] 
    unless size.nil? || size.include?(self.size)               
      errors.add(:upload_data, "* image must be 4MB or less")  
    end   
  end 


  before_thumbnail_saved do |thumbnail|
    record = thumbnail.parent
    thumbnail.user_id = record.user_id 
    thumbnail.listing_id = record.listing_id
  end

end     

Estou executando o seguinte

Rails 2.3.3

Image_Science 1.2.0

Obrigado - -tim

Foi útil?

Solução

Você também pode usar um retorno de chamada: antes_save para testar o objeto. Se for inválido, leve uma exceção.

Outras dicas

tente adicionar:

validate_on_update :attachment_valid?
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top