Class: ContainerController
- Inherits:
-
ApplicationController
- Object
- ActionController::Base
- ApplicationController
- ContainerController
- Defined in:
- app/controllers/container_controller.rb
Instance Method Summary collapse
-
#destroy ⇒ Object
Destruction d’un Container.
-
#index ⇒ Object
Renvoi vers l’action
list
. -
#list ⇒ Object
Affiche une liste, en lecture seule, des Container SL.
-
#register ⇒ Object
Enregistrement ou mise à jour d’un container et de ses objects in world.
-
#show ⇒ Object
Affiche le détail d’un Container.
Instance Method Details
#destroy ⇒ Object
Destruction d’un Container.
Important : la version actuelle refuse de détruire un Container non vide.
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'app/controllers/container_controller.rb', line 67 def destroy # XXX : Ce n'est pas propre, mais puisqu'on est obligé d'avoir ":dependent => :destroy" # dans la relation entre un container et les objets in world, c'est dans le controleur # qu'on doit s'assurer qu'il n'est pas interdit de supprimer un container plein... container = Container.find(params[:id]) if container.objects_in_world.empty? container.destroy redirect_to :action => 'list' else # Interdiction de supprimer un conteneur plein render :text => "Cannot delete a non-empty container.", :status => "409 Container not empty", :layout => false, :content_type => "text/plain" end end |
#index ⇒ Object
Renvoi vers l’action list
6 7 8 9 |
# File 'app/controllers/container_controller.rb', line 6 def index list render :action => 'list' end |
#list ⇒ Object
Affiche une liste, en lecture seule, des Container SL.
16 17 18 |
# File 'app/controllers/container_controller.rb', line 16 def list @container_pages, @containers = paginate :containers, :per_page => 10 end |
#register ⇒ Object
Enregistrement ou mise à jour d’un container et de ses objects in world. Cette action est appelée en POST
avec un seul paramètre, content
. Le format de données est l’un des 2 suivants :
-
nom1|key1|type1,nom2|key2,type2,…
-
nom1|key1,nom2|key2,…
Si le champ type
n’est pas donné, il prend la valeur par défaut “texture”.
Après la création ou mise à jour du container, tous ses objets sont mises à jour :
-
ceux qui n’existent plus sont supprimés
-
les objets à modifier sont mis à jour
-
les nouveaux objets sont créés
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'app/controllers/container_controller.rb', line 33 def register # Récupère les paramètres fournis par Second Life slattrs = get_secondlife_attrs # Création ou mise à jour du container container = Container.find_or_initialize_by_container_key(slattrs.delete(:key)) container.update_attributes!(slattrs) # Maintenant création ou mise à jour des objets # Les objets sont séparés par des virgules objects = params[:content].split(/,/).collect { |line| # Les champs sont séparés par une barre verticale fields = line.split(/\|/) # Conservation de la structure historique du script Webia en PHP, # qui avait une version spéciale uniquement pour les textures, # dont le champ type était donc implicite. fields = fields + ["texture"] if fields.size == 2 object = ObjectInWorld.find_or_initialize_by_object_key(fields[1]) object.update_attributes!(:name => fields[0], :otype => fields[2], :container => container) object } # Et on remplace les objets existants par ceux-là, avec une fonction qui # optimise les ajouts/suppressions container.objects_in_world.replace(objects) render :nothing => true end |
#show ⇒ Object
Affiche le détail d’un Container
60 61 62 |
# File 'app/controllers/container_controller.rb', line 60 def show @container = Container.find(params[:id]) end |