Ouverture de session

Commentaires récents

Syndication
Flux XML

Une Base de Donnees qui ne respecte pas les conventions Ror...

Une Base de Donnees qui ne respecte pas les conventions Ror...
Posté par Kilemo le Mercredi, 19 Mars, 2008 - 11:21pm. Débuter avec Rails

Tout d'abord bien le bonjour a tout le monde. Je suis tout neuf sur rails et croyez bien que j'ai effectué de nombreuses recherches avant de demander de l'aide.

Alors voila, j'expose mon problème. Je voudrais faire une application toute simple en rails utilisant une base de données pré-existante. Cette base de données ne peu en aucun cas être modifié ou édité, car elle est utilisé par un autre programme dont je ne suis pas responsable.
Mon objectif est pour le moment très simple: afficher les informations de cette BD dans une simple vue. Et pourtant rien n'est simple !

Ma base de données (MySQL) s'appelle alarm et la table qui je veux afficher également. Le problème majeur est que l'identifiant de cette table (id) est un varchar de type "Alarm.rpf.1202753583966". Rails n'aimant pas les strings pour les identifiants, je dois donc le convertir. La chance me souris car la partie chiffre de chaque id est unique. J'ai donc écris le petit model suivant:

class Alarm < ActiveRecord::Base
set_table_name "alarm"
set_primary_key "id"
def id
self.id.split('.').last().to_i
end
def to_param
"#{self.id}"
end
end

Ensuite j'ai un controller:

class AlarmsController < ApplicationController
def index
@alarms = Alarm.find(:all)
end
end

Puis une vue:

<% for alarm in @alarms %>
<tr>
<td><%=h alarm.id %></td>
</tr>
<% end %>

Avec tout ce joli bazar, j'obtiens lorsque je tente d'afficher l'index:


SystemStackError in Alarms#index

Showing alarms/index.html.erb where line #9 raised:

stack level too deep

Extracted source (around line #9):

6:
7:
8:
9:
10:
11:
12: 'Are you sure?', :method => :delete %>

RAILS_ROOT: F:/work/alarmManager
Application Trace | Framework Trace | Full Trace

app/models/alarm.rb:5:in `id'
app/models/alarm.rb:5:in `id'
app/views/alarms/index.html.erb:9:in `_run_erb_47app47views47alarms47index46html46erb'
app/views/alarms/index.html.erb:7:in `each'
app/views/alarms/index.html.erb:7:in `_run_erb_47app47views47alarms47index46html46erb'

Si je change l'identifiant de la table, cela marche alors très bien mais j'ai malheureusement besoin d'utiliser ce string comme identifiant.

Je ne comprend pas trop l'erreur que j'ai et suis a l'écoute de toute suggestion.
Merci d'avance.



[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | sujet précédent | sujet suivant | envoyer par email ]

Options d'affichage des commentaires
Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder" pour activer vos changements.

Sujet: 
Le probleme vient de la
Auteur: 
dam5s
Date: 
Jeu, 20/03/2008 - 10:40

Le probleme vient de la recursivite de ta methode "id" qui utilise self.id (elle-meme).

Je ne sais pas comment tu pourrais faire ce que tu veux (utiliser la table et faire comme si l'attribut id était correct).

Ce pendant as-tu la possibilité de créer des vues dans la bdd que tu utilises? Cela n'affecterait pas le programme utilisant la table et cela te permettrait d'avoir une table plus propre et mieux adapatée à ce que tu veux en faire.

--
Damien
http://www.webdrivenblog.com/


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Merci beaucoup pour ta
Auteur: 
Kilemo
Date: 
Jeu, 20/03/2008 - 18:31

Merci beaucoup pour ta réponse mais je pense avoir trouvé la solution. Le probleme est bien celui que tu disais, la recursivité de la méthode id.
Grace a un peu de bidouille (et l'aide d'un ami champion de Rails), j'ai trouvé une solution qui marche:
- J'ai renomé la methode id en numeric_id
- J'ai change le to_param pour qu'il pointe sur numeric_id
- J'ai créé une méthode find_by_numeric_id qui recupere l'id correspondant au numeric_id donné en parametre. J'ai donc dans mon modele:

class Alarm < ActiveRecord::Base

set_table_name "alarm"

set_primary_key "id"

def self.find_by_numeric_id(nid)

Alarm.find(:first,:conditions => ['id LIKE ? ', '%'+nid.to_s])

end

def numeric_id

self.id.split('.').last().to_i

end

def to_param

"#{self.numeric_id}"

end

end

Et mon controller:

class AlarmsController < ApplicationController
def index
@alarms = Alarm.find(:all)
end

def show

@alarm = Alarm.find_by_numeric_id(params[:id])
end
end

Voila voila, merci encore pour ta reponse.


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Nouveaux liens

Sondage
Lorsque je développe avec Ruby on Rails c'est principalement sous:
Linux
37%
Mac OS X
29%
Windows
32%
(Free|Open|Net) BSD
1%
Autre...
1%
Nombre de votes: 356

Qui est en ligne
Il y a actuellement 1 utilisateur et 49 invités en ligne.

railsfrance.org - communauté francophone des utilisateurs de Ruby on Rails
[ Hébergement et ressources techniques gracieusement fournis par la SSLL Nuxos Group ]