svergeylen / collector

Collector : site de gestion des BD, films, DVD, jeux de société, ...
2 stars 0 forks source link

Formulaire spécifique "Ajout BD" #79

Closed svergeylen closed 6 years ago

svergeylen commented 6 years ago

En créant un item, il faut lui associer un/des folders (ex-tags).... L'ajout avec javascript>chosen fonctionne mais il faut tester et affiner l'UX. Il faut se focaliser sur la création d'une BD :

Le problème est qu'on va mettre le folder "Thorgal", mais on va oublier de mettre le folder "BD" ... et dès lors la database sera étonnement construite...

Pour le moment, toutes les BD ont le folder "nom de la série" et "bd"... comme tu voulais... afin de pouvoir faire une recherche par folder (plus tard)...

svergeylen commented 6 years ago

Créer un formulaire d'ajout de BD spécialié qui reprend tous les tags du dernier items de la série BD affichée... ex : on veut ajouter Thorgal n°3, on recoit comme tag par défaut les tags du n°2, càd "bd", "thorgal", "vanhamme", "rosinski"

svergeylen commented 6 years ago

Voici le nouveau formulaire d'ajout de BD... Il faut maintenant :

screenshot_2018-09-13 vergeylen eu

Séries --> Tag.first_or_create(name: 'Séries') Auteurs --> Tag.first_or_create(name: 'Auteurs') Rangement -> Tag.first_or_create(name: 'Rangement')

svergeylen commented 6 years ago

Pour remplacer le chosen_select vachement vieillissant... https://selectize.github.io/selectize.js/

svergeylen commented 6 years ago

Coucou, voilà j'ai à nouveau des unpermitted parameters dans le nouveau formulaire "ajout BD" :

Submit de item ( item > create ), avec trois champs de tags de type "string" :series, :auteurs et :rangement...

Unpermitted parameters: :series, :auteurs, :rangement, :view

C'est logique, vu que ces champs n'existent pas dans le modèle Item... mais bon, j'ai fait

params.require(:item).permit(:number, :name, :description, :attachments, series: [], auteurs: [], rangement: [], tag_ids: [])

ou aussi

params.require(:item).permit(:number, :name, :description, :attachments, :series, :auteurs, :rangement, tag_ids: [])

afin qu'il me laisse lire ces données, mais sans succès.

Forcément, ca marche en console... mais pas dans les controlleurs... (lol !) Par exemple, pour la série : @item.update_tags_with_parent("Thorgal", Tag.where(name:"Séries").first )

Si tu as une bonne idée... ;-) https://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html

dvergeylen commented 6 years ago

Stp.. Pour la 3ème fois, tu dois mettre des accolades 😑

params.require(:item).permit(:number, :name, :description, :attachments, {series: []}, {auteurs: []}, {rangement: []}, tag_ids: [])

Le dernier argument n'a pas besoin d'accolades, même si c'est un array.

Tu auras probablement une erreur du genre ActiveModel::UnknownAttributeError (unknown attribute 'series' for Item.) mais ça c'est un autre problème.

svergeylen commented 6 years ago

Stp.. Pour la 3ème fois,

Pourquoi tant de condescendance ? Ne te sens pas obligé de répondre si tu n'as pas envie... Et oui, en effet, cela ne marche toujours pas : UnknownAttributeError

dvergeylen commented 6 years ago

Parce que je t'ai déjà averti de cette particulartié de syntaxe ici et , mais tu ne tiens pas compte de l'entièreté de ma réponse, tu essaies le 1er truc qui marche sans comprendre... Alors forcément quand tu re-rencontres le problème tu ne sais toujours pas quoi faire...

Si tu codes des trucs non triviaux, tu dois passer beaucoup beaucoup plus de temps à lire de la doc qu'à coder. Tu dois augmenter ta compréhension globale du framework et ce temps est incompressible...

Pourquoi faut-il mettre ces fichues accolades? Parce qu'on est en Ruby, donc permit est une fonction qui s'exécute sur son objet (params de type ActionController::Parameters) et accepte des filtres et/ou un hash si une key peut avoir plusieurs instances. C'est documenté dans permit, ce n'est pas de la magie.

Pourquoi ça marche en console et pas dans l'application? Parce que item_params est une fonction private dans un ApplicationController (Rails 4+), qui n'est pas du tout impliquée dans le flow des données lorsqu'elles sont manipulées en console (qui manipule directement des ActiveModel). Alors forcément si tu ne fais pas appel à permit, tu n'auras pas de unpermitted parameters... C'est la première phrase de la section Strong Parameters du Rails Guide sur Action Controller, ce n'est pas de la magie...

Pourquoi est-ce qu'il y a maintenant UnknownAttributeError ? Parce que Rails utilise l'excellent ActiveRecord qui est un ORM donc chaque instance d'objet représente une entrée correspondante dans la table du même nom et tous ses champs sont mappés automatiquement. Si tu ajoutes des champs à l'objet, il seront inconnus car ils n'existent pas dans la database et ne peuvent pas être inférés. C'est décrit dans le deuxième paragraphe de la doc sur ActiveRecord, ce n'est pas de la magie. Si tu veux ajouter des champs, tu dois définir des virtual_attributes (railscast).

Je trouve que le développement du Collector 2.0 est vraiment une très bonne chose, aucun doute là-dessus et justement, puisque le projet n'est pas facile (on parle quand même de coder des associations many-to-many polymorphiques) ça demande un mindset beaucoup plus "développeur" que "assembleur". Effectivement, ça passe par des excellents commit messages (comme tu le fais déjà), par une bonne gestion des issues avec des liens et des références, par une longue lecture de la doc, par une compréhension profonde des interactions entre tous les Active* (pas évidentes) et par les paradigmes encouragés en Ruby.

Tout ça ne s'acquiert pas en quelques temps, ça prend des années et moi-même je me considère pas du tout comme un expert à ce petit jeu. C'est un apprentissage quotidien qui ne s'arrête jamais. Alors je sais chaque fois je passe pour l'enquiquineur mais quand je te donne une proposition de solution, essaie de ne pas juste l'appliquer mais de voir un peu plus large, il y a peut-être du bon à prendre... Je serai ravi de t'aider (ravi, vraiment, d'ailleurs j'essaie systématiquement de te faire des réponses complètes et reproductibles) mais ça ne marchera que si tu es plutôt "cool, j'ai de nouveaux indices en plus" que "marche pô, solution non copier-collable"...

Bisous

svergeylen commented 6 years ago

Bein, oui, je sais tout ca... ca fait des années que tout cela existe, merci... pas besoin de faire la morale en plus... ? Le truc, c'est que je pense pas qu'il faille créer ces attributs complémentaires, vu qu'on ne souhaite pas les sauver... ! donc rien de tout ceci ne me semble utilisable, bien que c'est certainement correct...

La différence entre toi et moi c'est que toi, c'est ton métier depuis plusieurs années, et moi, je n'ai quelques instants par ci par là pour implémenter ton idée de tags afin que tu adhères au collector... et je peux te dire que c'est pas simple de trouver de la motivation, même avec tes réponses complètes... Je vais tenter une autre approche...

dvergeylen commented 6 years ago

Je vais tenter une autre approche...

C'est bien dommage...

[...] c'est ton métier depuis plusieurs années

C'est devenu mon métier parce que j'ai appliqué cette approche...

svergeylen commented 6 years ago

L'autre approche, c'était de tenter un form_tag au lieu d'un form_with(model).... cela marche, mais c'est moins beau... je pense qu'il faut que le code soit beau, mais j'imaginais au départ que tu m'aides dans le code plutôt que de m'expliquer Rails... Je pense qu'on ne s'est pas compris...

svergeylen commented 6 years ago

Allez, ca repart dans la bonne direction aujourd'hui.... "Chouette j'ai des indices en plus écrits au -dessus"... la journée commence par un railscast sur - surprise - les virtual attributes :-/

dvergeylen commented 6 years ago

Super! Je te réponds sur #90 parce que j'ai trouvé une façon super de faire (grâce aux éclairages que tu donnes)

svergeylen commented 6 years ago

voir e02b2395b4d44f789ca398dafef515ad9502fef7 et aussi : cb01b7f81a195f2a9629ce0ddd07adc6da69854b