Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    problema con gsub nel controller

    Ciao,
    ho un problema con la funzione gsub, devo sostituire "," cn "','"
    Ho provato nella console questo
    "1,2".gsub(",","','") and I get "1','2" -> ok
    ma nel controller
    codice:
    @photos_ids_to_delete = params[:delete_photo_array].gsub("," , "','")
    @record_to_delete = Photo.find(:all, :conditions => { :id => [@photos_ids_to_delete] } )
    e nel mio log del server ho
    codice:
    SELECT * FROM 'photos' WHERE ('photos'.'id' IN ('1\',\'2'))
    com'è possible?
    Grazie

  2. #2
    Utente di HTML.it L'avatar di toraz
    Registrato dal
    Nov 2001
    Messaggi
    263
    Per prima cosa non serve chiedersi come sia possibile. Per fare quello che stai cercando di fare, hai scelto un modo orribile, quindi meglio lasciare perdere e ricominciare da capo.

    Se hai una stringa di id del tipo "1,2,3" e vuoi cancellare gli oggetti che hanno quegli id, un sistema migliore potrebbe essere di ricavare un array di id dalla stringa e poi usare il metodo delete (o destroy a seconda del caso).
    codice:
    photos_id_to_delete = :params[:delete_photos].split(",")
    Photo.delete(photos_id_to_delete)
    Ancora meglio sarebbe incapsulare questo comportamento all'interno della classe Photo definendo un metodo che accetti come parametro la stringa e faccia quel che deve fare
    codice:
    class Photo < ActiveRecord::Base
      ...
      def self.delete_by_string(string)
        ids = string.split(",")
        self.class.delete(ids)
      end
      ...
    end
    Nel controller
    codice:
    Photo.delete_by_string(params[:delete_photos])

  3. #3
    grazie delle dritte!
    Ho inserito nel modello photo il tuo metodo ma ottendo questo
    codice:
    NoMethodError: undefined method `destroy_by_ids' for #<Class:0x356473c>
            from c:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record
    /base.rb:1964:in `method_missing'
            from (irb):1
    e lo chiamo da console in questo modo
    codice:
    Photo.destroy_by_ids("118,119")
    Per essere sicuro di non aver fatto ulteriori casini ecco il modello
    codice:
    require 'mime/types'
    
    class Photo < ActiveRecord::Base
      has_attached_file :file,
      :styles => {
        :thumb => "100x100#"
      }
      validates_attachment_presence :file
      validates_attachment_content_type :file, :content_type => ['image/jpeg', 'image/pjpeg', 'image/jpg']
      
      def self.destroy_by_ids(string)
        ids = string.split(",")
        self.class.destroy(ids)
      end  
      
      def swfupload_file=(data)
        data.content_type = MIME::Types.type_for(data.original_filename).to_s
        self.file = data
      end
    
    end

  4. #4
    così funzia
    codice:
      def self.destroy_by_ids(string)
        ids = string.split(",")
        self.destroy(ids)
      end
    ho eliminato .class .
    Un'altra domanda, come faccio a comunicare che l'operazione è andata a buon fine? Cioè che tutti gli elementi sono stati cancellati? Posso farmi ritornare un bool da destroy_by_ids?
    Dato che sono alle prime armi, chiedo a voi qual'è il modo migliore.
    Grazie

  5. #5
    Utente di HTML.it L'avatar di toraz
    Registrato dal
    Nov 2001
    Messaggi
    263
    Originariamente inviato da mlipreri
    Un'altra domanda, come faccio a comunicare che l'operazione è andata a buon fine? Cioè che tutti gli elementi sono stati cancellati? Posso farmi ritornare un bool da destroy_by_ids?
    Dato che sono alle prime armi, chiedo a voi qual'è il modo migliore.
    Forse la cosa migliore che puoi fare, anche se non ci giurerei, è lasciare tutto così e "riutilizzare" il comportamento di destroy.

  6. #6
    scusa cosa intendi per "riutilizzare il comportamento di destroy"?

  7. #7
    Utente di HTML.it L'avatar di toraz
    Registrato dal
    Nov 2001
    Messaggi
    263
    Intendo che il metodo per come lo hai definito, ritorna gli stessi valori e solleva le stesse eccezioni di destroy.

  8. #8
    Personalmente non condivido l'approccio fin dall'inizio. Non tanto quanto espresso da toraz che ha fornito il miglior supporto possibile, quanto l'idea iniziale di manipolare i dati della form in modo grezzo.
    Io avrei fatto così:

    1. nella form mi ingegno in modo che i parametri passati siano nella forma

    codice:
    photo_ids[]=2,3,4,5,6
    In questo modo i parametri vengono automaticamente tradotti in un array, nel formato

    params[hoto_ids] = [2, 3, 4, 5, 6, 7]

    2. A questo punto, basta una chiamata a find con conseguente destroy.

    Photo.find(params[hoto_ids]).each(&:destroy)

    3. Se vuoi avere il risultato del destroy

    results = Photo.find(params[hoto_ids]).map(&:destroy)
    failed = results.any? { |result| result == false }

    failed è false se c'è anche solo un record che non è stato cancellato.

    4. Per sapere quale record, etc etc modifica la struttura a tuo piacimento. Questa è la versione semplice e parzialmente incompleta.

    5. Io se avessi un comportamento simile procederei diversamente. Farei in modo di creare un metodo destroy! che mi lancia un'eccezione. Inserirei la lista di destroy in una transazione annullabile nel momento in cui anche uno solo dei destroy lancia eccezione.
    In questo modo saprei quale ha lanciato eccezione, potrei prendere contromisure e soprattutto non avrei dati cancellati a metà.

  9. #9
    grazie a tutti! Ho implementato i punti 1/2/3/4 di weppos ma mi piacerebbe capire come funzionano le transazioni in rails, su google non ho trovato molto, qualcuno ha qualche link con qualche esempio o ha la pazienza di scrivere 2 righe in merito? Grazie

  10. #10

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.