Bonjour à tous.
Voilà le contexte. J'utilise Redmine 3.3.3, basé sur Ruby On Rails.
Afin de réaliser des cartes et de gérer des issues géoréférencée, un table "pointes" permet pour chaque Issue d'être géolocalisée.
Cette table contient l'id de l'Issue, l'id du pointé, un point (base de données spatiale postgresql), un état et diverses informations.
Afin de visualiser ces coordonnées mais aussi de pouvoir en modifier les informations, plusieurs plugins ont été développés (permettant d'ajouter / supprimer un plusieurs pointés par FT via des requêtes rest).
Pour afficher les informations des pointés, un fichier a été ajouté dans <nom du plugin>/lib/<nom du plugin>/view_hook_listeners.rb
Ceci va exécuter le fichier app/views/<nom du plugin>/issue/_issus_details.html.erb pour injecter du code dans la page de visualisation de l'Issue et ça marche très bien.
view_hook_listeners.rb :
module GeometryStatus
# Voir : http://www.redmine.org/projects/redmine/wiki/Hooks
class Hooks < Redmine::Hook::ViewListener
# rewrite select for trackers on issue form // view_issues_show_details_bottom
def view_issues_show_details_bottom(context={})
issue = context[:issue]
project = context[:project]
--- du code non copié ici car un peu complexe ---
# charger le fichier app\views\geometry_status\issues\_issue_details.html.erb
return context[:controller].send(:render_to_string, partial: 'geometry_status/issues/issue_details', locals: { project: project, issue: issue, pointes: pointes, portee_du_defaut: portee_du_defaut, port: qgis_plugin_port?, chantier_name: chantier_name, geomaps_map_server_login: geomaps_map_server_login?, geomaps_map_server_password: geomaps_map_server_password?, geomaps_map_server_url: geomaps_map_server_url?, nb_status_total: nb_status_total, nb_status_to_validated: nb_status_to_validated, nb_status_resolved: nb_status_resolved, nb_status_refused: nb_status_refused })
end
''
end
end
end
Ce que je veux
Le formulaire affichant les informations des pointés a été injecté en javascript dans la page de détails de l'Issue et fonctionne (la sauvegarde des modifications est faite en AJAX). Toutefois, afin d'obtenir une meilleur intégration dans Redmine j'ai souhaité non pas utiliser un formulaire normal avec form mais le faire en rails (sinon ça pose des problèmes de détection de champs modifiés non sauvé (ou sauvé) mal pris en charge par Rails puisqu'on ne passe pas par le framework) :
Le code suivant est placé dans une boucle, en effet il peut y avoir plusieurs instances de 'pointé' par FT, chaque instance ayant son formulaire propre.
<%= form_for :pointe, html: {class: 'geometry_pointe_form'} do |form| %>
<%= form.hidden_field :id, value: pointe.id %>
<legend><strong><%= l(:geometry_legend_status) %></strong></legend>
<%= form.select(:statut, options_for_select([[l(:geometry_status_new), 1],
[l(:geometry_status_refused), 2],
[l(:geometry_status_accepted), 3],
[l(:geometry_status_to_validated), 4],
[l(:geometry_status_resolved), 5],
[l(:geometry_status_confirmed), 6]
],
pointe.statut)) %>
.... les autres champs .....
<%= form.submit "Submit" %>
<% end %>
Ce que j'obtiens
J'obient exactement ce que je veux au niveau affichage, bien entendu le code est bien plus complexe.
Par contre impossible de savoir quoi mettre dans quel fichier pour capter le submit et sauver en base de données les informations modifiées.
J'obtiens "Page not found" systématiquement lorsque je clique sur le bouton submit.
J'ai bien tenté dans app/status/controller/pointe_controller.rb de mettre le code suivant mais sans aucun effet.
Et quand ça ne fonctionne pas, on peut pas dire de rails nous aide à comprendre les choses.
class PointeController < ApplicationController
def create
Pointes.create(params[:id])
end
def update
@pointe = Pointes.find(params[:id]]))
if @pointe.update(pointe_params)
redirect_to 'pages/success'
else
redirect_to 'pages/error'
end
end
private
def pointe_params
params.require(:id).permit(:comment, :statut)
end
end
Voilà, j'ai passé deux jours à porter de façon propre le formulaire que j'avais fait en javascript exclusivement, mais maintenant il faut que je le sauve ce(s) sacré(s) formulaire(s) !
Merci pour vos réponses.