Class: ContainerController

Inherits:
ApplicationController show all
Defined in:
app/controllers/container_controller.rb

Instance Method Summary collapse

Instance Method Details

#destroyObject

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

#indexObject

Renvoi vers l’action list



6
7
8
9
# File 'app/controllers/container_controller.rb', line 6

def index
  list
  render :action => 'list'
end

#listObject

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

#registerObject

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

#showObject

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