JeuWeb - Crée ton jeu par navigateur
[Résolu][Rails] Modifier le form helper - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu][Rails] Modifier le form helper (/showthread.php?tid=6552)

Pages : 1 2 3


RE: [Résolu][Rails] Modifier le form helper - Holy - 18-01-2013

(17-01-2013, 10:59 PM)Sephi-Chan a écrit :
(17-01-2013, 10:19 PM)Holy a écrit :

= h.input :nation, :collection => t('nations').map {|k, v| [v, k]}

Je ne comprends pas trop pourquoi fais un map sur ce qui semble être une chaîne ( t('nations')).



= h.input :nation, collection: Nation::NAMES.map { |name| [ name, t([ 'nations', name ]) }

Ainsi, le map te donnera un tableau de tableaux. Tu devras peut-être inverser les 2 éléments du tableau (l'un sert de libellé, l'autre d'attribut value), mais l'idée y est.
En fait, mon t('nations') renvoie à un tableau et non une chaine. Voilà l'extrait à quoi correspond cette traduction :
  nations:
klum: Empire Mécanique de Klüm
garn: Horde d'Al Garn
ulysk: Nation Marchande d'Ulysk
ludwynn: Royaume Académique de Ludwynn
Je fais la même chose que toi en utilisant directement le fichier d'internationalisation plutôt que ma classe Nation en fait. Ma solution est moins logique surtout si je décide de changer la façon dont je récupère mes noms plus tard (depuis une bdd).

(17-01-2013, 10:59 PM)Sephi-Chan a écrit : Tu peux faire quelque chose comme :


class Race
NAMES = { 'klum' => %w( dwarf human ), 'ulysk' => %w( elf dwarf human ) }
end


class Hero < ActiveRecord::Base
validates :nation, presence: true, inclusion: { in: Nation::NAMES }
validates :race, presence: true, inclusion: { in: lambda { |hero| Race::NAMES[hero.race] } }
end
La fonction anonyme renvoie un objet. Mais elle l'hérite d'où ? ^^


RE: [Résolu][Rails] Modifier le form helper - Sephi-Chan - 18-01-2013

Effectivement je te déconseille de te fier à la structure de ton système d'i18n, ça ne paraît pas très robuste. Smile

L'expression lambda utilisée par le validateur est appelée (par Active Record) avec l'objet comme paramètre. C'est documenté comme tel dans l'API. Le but est justement de pouvoir fournir un enumerable plus dynamique qu'un simple tableau statique.


RE: [Résolu][Rails] Modifier le form helper - Holy - 18-01-2013

J'ai encore un ultime soucis concernant la validation du champ race. Depuis que j'ai modifié la validation en utilisant une methode anonyme, j'ai droit à une erreur lorsque je soumets mon formulaire :
Code :
undefined method `include?' for nil:NilClass

Elle renvoie à la ligne où je sauvegarde l'utilisateur dans mon contrôleur. Dés que je retire la validation sur le champ race, ça passe. Je comprends pas trop l'erreur pour le coup ^^

Autre chose, comment t'as fait pour retrouver cette info concernant l'expression lambda dans l'API, parce que j'ai un peu du mal à m'y retrouver dans la doc Rails >_<


RE: [Résolu][Rails] Modifier le form helper - Sephi-Chan - 18-01-2013

Pour trouver l'info, je suis allé voir la documentation de validates, puis sur validates_inclusion_of.

Ton erreur semble être que Race::NAMES[hero.race] retourne nil. Reste à savoir pourquoi.

Pour en savoir plus, essaye d'en savoir plus sur l'état de chaque chose, avec un petit :


validates :race, presence: true, inclusion: { in: lambda { |hero| raise [ hero, Race::NAMES, Race::NAMES[hero.race] ].to_yaml } }



RE: [Résolu][Rails] Modifier le form helper - Holy - 18-01-2013

Au temps pour moi, je devais avoir la tête ailleurs, il s'agit de hero.nation et pas hero.race qui devait être renseigné comme clé du hash Race::NAMES. A force de trop tricoter Tongue

Je ne saurais trop te remercier pour ton aide, je me suis embarqué dans de la personnalisation un peu complexe, mais ça me permet de découvrir Rails "en dur". Je vais essayer de me référer un maximum à la documentation désormais, mais c'est pas encore simple pour moi de m'y retrouver Smile

On peut voir le résultat ici : http://terresdecy.herokuapp.com/register