rajout de ressource dans rails 4

34 views
Skip to first unread message

ziburudebian

unread,
Nov 22, 2016, 7:59:29 AM11/22/16
to Railsfrance
bonjour à tous

j'ai un model/controller/vue nommé clients qui fait classiquement edit, show, update

dans app/controllers/clients_controller.rb j'ai ce début de code

class ClientsController < ApplicationController
  
  before_action :set_client, only: [:show, :edit, :update, :destroy]

  respond_to :html
  
  def index
    @clients = Client.all
    respond_with(@clients)
  end

  def show
    respond_with(@client)
  end
  
  def print

  end

......


dans ma vue j'ai ceci :

div.milieu
table border="1"
 thead
   tr
     th "IDENT"
     th "NOM"
 tbody
   - clients.each do |client|
     tr
       td = client.ident
       td = client.lastname
br   
div.action
table
tr
                     td
 = button_to "new", url_for([:new, :"client"]), :method => "get"
td
 = button_to "print", url_for([:print, :"clients"]), :method => "get"


je souhaite rajouter une méthode print et donc dans ma route j'ai rajouté

resource :clients do 
    get "print" 
  end 


ainsi qu'une méthode dans mon controller (cf plus haut) et une vue print.html.slim

lorsque rails charge ma vue les deux boutons new et print s'affichent correctement mais quand je clique sur print j'ai une erreur ; voici la log :

I, [2016-11-22T13:45:20.972040 #20643]  INFO -- : Started GET "/clients" for 92.103.19.65 at 2016-11-22 13:45:20 +0100
I, [2016-11-22T13:45:21.037813 #20643]  INFO -- : Processing by ClientsController#index as HTML
I, [2016-11-22T13:45:21.268393 #20643]  INFO -- :   Rendered clients/index.html.slim within layouts/application (205.5ms)
I, [2016-11-22T13:45:21.276660 #20643]  INFO -- :   Rendered tpl/_header.html.slim (5.6ms)
I, [2016-11-22T13:45:21.350503 #20643]  INFO -- :   Rendered tpl/_menu.html.slim (73.1ms)
I, [2016-11-22T13:45:21.460437 #20643]  INFO -- :   Rendered tpl/_footer.html.slim (108.3ms)
I, [2016-11-22T13:45:21.460910 #20643]  INFO -- : Completed 200 OK in 423ms (Views: 387.4ms | ActiveRecord: 14.7ms)
I, [2016-11-22T13:45:24.046331 #20643]  INFO -- : Started GET "/clients/print" for 92.103.19.65 at 2016-11-22 13:45:24 +0100
I, [2016-11-22T13:45:24.053057 #20643]  INFO -- : Processing by ClientsController#show as HTML
I, [2016-11-22T13:45:24.053158 #20643]  INFO -- :   Parameters: {"id"=>"print"}
I, [2016-11-22T13:45:24.058554 #20643]  INFO -- : Completed 404 Not Found in 5ms
F, [2016-11-22T13:45:24.060876 #20643] FATAL -- : 
ActiveRecord::RecordNotFound (Couldn't find Client with 'id'=print):
  app/controllers/clients_controller.rb:130:in `set_client'


on dirait qu'il charge le show alors que je lui demande le print

Merci pour votre aide

Guirec Corbel

unread,
Nov 22, 2016, 8:13:52 AM11/22/16
to rails...@googlegroups.com
Salut,

Peux-tu essayer de faire :

resource :clients do
  collection do
    get "print"
  end
end

ça devrait fonctionner.

--
--
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse rails...@googlegroups.com
Pour résilier votre abonnement envoyez un e-mail à l'adresse railsfrance-unsubscribe@googlegroups.com
---
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Railsfrance".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse railsfrance+unsubscribe@googlegroups.com.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.

Gregory Frerot

unread,
Nov 22, 2016, 10:32:38 AM11/22/16
to rails...@googlegroups.com
Peut-être rajouter la méthode :print dans ton "before_action"

--
--
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse rails...@googlegroups.com
Pour résilier votre abonnement envoyez un e-mail à l'adresse railsfrance-unsubscribe@googlegroups.com
---
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Railsfrance".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse railsfrance+unsubscribe@googlegroups.com.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.



--
Grégory Frerot
------------------------------------------
Webdesigner / UI Designer @ Effigy sprl

ziburudebian

unread,
Nov 22, 2016, 11:18:38 AM11/22/16
to Railsfrance
ça n'a pas marché
Pour résilier votre abonnement envoyez un e-mail à l'adresse railsfrance...@googlegroups.com

---
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Railsfrance".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse railsfrance...@googlegroups.com.

ziburudebian

unread,
Nov 22, 2016, 11:19:07 AM11/22/16
to Railsfrance
non plus ça ne resout pas le probleme
Pour résilier votre abonnement envoyez un e-mail à l'adresse railsfrance...@googlegroups.com

---
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Railsfrance".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse railsfrance...@googlegroups.com.

Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.

Patrick Lamotte

unread,
Nov 22, 2016, 11:42:32 AM11/22/16
to rails...@googlegroups.com
get /print' => clients#print', as: print'
ça devrait marcher

Patrick Lamotte

unread,
Nov 22, 2016, 11:42:32 AM11/22/16
to rails...@googlegroups.com
à mettre dans routes.rb bien sûr



Le 22 nov. 2016 à 17:19, ziburudebian <devm...@gmail.com> a écrit :

Olivier El Mekki

unread,
Nov 22, 2016, 11:42:32 AM11/22/16
to rails...@googlegroups.com
Est-ce que tu pourrais montrer le contenu de ta méthode `set_client` ? Également, tu utilises `resource` (singulier) avec `clients` (pluriel) dans tes routes, est-ce que c'est volontaire?

Pour résilier votre abonnement envoyez un e-mail à l'adresse railsfrance...@googlegroups.com

---
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Railsfrance".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse railsfrance...@googlegroups.com.

Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.

--
--
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse rails...@googlegroups.com
Pour résilier votre abonnement envoyez un e-mail à l'adresse railsfrance...@googlegroups.com

---
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Railsfrance".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse railsfrance...@googlegroups.com.

julien bouchon

unread,
Nov 22, 2016, 11:42:33 AM11/22/16
to Railsfrance
Hello,
je crois que quand tu déclares tes routes comme ça, ça te génère une route de ce type:

/clients/[client_id]/print

si tu veux quelque chose comme clients/print essaie :

get "clients/print", to: 'clients#print', as: "print_clients"

julien bouchon

unread,
Nov 22, 2016, 3:30:11 PM11/22/16
to Railsfrance
à ajouter hors du bloc 'ressource' ;)

Florian Dutey

unread,
Nov 22, 2016, 9:03:11 PM11/22/16
to rails...@googlegroups.com
Si tu veux '/clients/:id/print", dans tes routes, tu ajoutes

resources :clients do
  member do
    get :print
  end
end

et dans ta vue

<button href="<%= print_client_path(client) %>">Print</button>

Si tu veux '/clients/print' (ce qui ne semble pas ce que tu veux)

resource :clients do
  collection do
    get :print
  end
end

et dans ta vue 

<button href="<%= print_clients_path %>">Print</button>

Mais il me semble important que tu lises et comprennes la doc des routes


--
--
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse rails...@googlegroups.com
Pour résilier votre abonnement envoyez un e-mail à l'adresse railsfrance-unsubscribe@googlegroups.com

---
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Railsfrance".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse railsfrance+unsubscribe@googlegroups.com.

Florian Dutey

unread,
Nov 22, 2016, 9:06:49 PM11/22/16
to rails...@googlegroups.com
PS: rajouter des routes sur une resource a base de
get '/client/print', to: 'clients#print'

n'est pas une bonne solution

Enfin, je pense que la solution de Guirel est la bonne. Le probleme vient que dans ta vue tu as url_for([:print, :clients])

New marche, donc il semblerait que le probleme soit que tu a ecrit clients et non client
Mais n'utilise pas url_for, utilise les methodes *_path a la place.

ziburudebian

unread,
Nov 23, 2016, 7:48:30 AM11/23/16
to Railsfrance
merci pour vos propositions

la solution de gregory de rajouter la méthode :print dans ton “before_action” ne change rien

le get ‘/print' ⇒ ‘clients#print', as: ‘print' dans route.rb de pix_plm ne donne rien non plus

get “clients/print”, to: 'clients#print', as: “print_clients” à rajouter en dehors du bloc ressource de julien bouchon ne marche pas non plus


j'essaye de mettre en place la solution de florain dutey et guirec corbel ;

dans route.rb j'ai mis ceci

...

resource
:clients do
  collection
do
   
get "print"
 
end
end
...


dans ma vue j'ai mis :

...

<button href="<%= print_clients_path %>">Print</button>
...



à la sortie dans ma log j'ai tj un message d'erreur mais un peu different :

..........
I
, [2016-11-23T13:24:16.078770 #29587]  INFO -- : Started GET "/clients" for 85.31.146.36 at 2016-11-23 13:24:16 +0100
I
, [2016-11-23T13:24:16.086970 #29587]  INFO -- : Processing by ClientsController#index as HTML
I
, [2016-11-23T13:24:16.323505 #29587]  INFO -- :   Rendered clients/index.html.slim within layouts/application (211.7ms)
I
, [2016-11-23T13:24:16.334618 #29587]  INFO -- :   Rendered tpl/_header.html.slim (7.1ms)
I
, [2016-11-23T13:24:16.477428 #29587]  INFO -- :   Rendered tpl/_menu.html.slim (142.1ms)
I
, [2016-11-23T13:24:16.489238 #29587]  INFO -- :   Rendered tpl/_footer.html.slim (10.9ms)
I
, [2016-11-23T13:24:16.489667 #29587]  INFO -- : Completed 200 OK in 403ms (Views: 366.4ms | ActiveRecord: 15.4ms)
I
, [2016-11-23T13:24:19.113782 #29587]  INFO -- : Started POST "/clients/print" for 85.31.146.36 at 2016-11-23 13:24:19 +0100
F
, [2016-11-23T13:24:19.115964 #29587] FATAL -- :
ActionController::RoutingError (No route matches [POST] "/clients/print"):
  actionpack
(4.1.7) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (4.1.7) lib/action_dispatch/middleware/show_exceptions.rb:30:in `
call'
  railties (4.1.7) lib/rails/rack/logger.rb:38:in `call_app'

  railties
(4.1.7) lib/rails/rack/logger.rb:20:in `block in call'
............



pour info lorsque je tape sur la console rake route


........
print_clients GET    
/clients/print(.:format)                      clients#print
              POST  
/clients(.:format)                            clients#create
.......


                 
si vous avez une autre idéé, je suis preneur avant de me plonger dans la doc des routes comme vous me conseillez !!!



Florian Dutey

unread,
Nov 23, 2016, 8:13:12 AM11/23/16
to rails...@googlegroups.com
resources :clients, au pluriel pour resources.

Deja, dis nous ce que "print" est sense faire, histoire qu'on comprenne un peu mieux :)

ziburudebian

unread,
Nov 23, 2016, 10:34:27 AM11/23/16
to Railsfrance
effectivement j'avais oublie le s de ressource mais cela ne fonctionne toujours  pas
le print, je l'ai pas encore code, j'ai mis pour l'instant un redirect_to; le but futur (mais ce n'est pas là le sujet) consistera à envoyer dans un pdf avec whhtmltopdf la page web

ce que j'aimerai bien comprendre (avant de lire.. le doc des routes...) c'est pourquoi http://localhost:3000/clients/print ne fonctionne pas alors qu'il est dans la route !!!


Le mardi 22 novembre 2016 13:59:29 UTC+1, ziburudebian a écrit :

Olivier Gosse-Gardet

unread,
Nov 23, 2016, 10:37:21 AM11/23/16
to Railsfrance
Bonjour,

La log transmises dans ton mail précédent indique un POST 
Started POST "/clients/print" for 85.31.146.36 at 2016-11-23 13:24:19 +0100
F
, [2016-11-23T13:24:19.115964 #29587] FATAL -- :
ActionController::RoutingError (No route matches [POST] "/clients/print"):

C'est normal ? 


--
--
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse rails...@googlegroups.com
Pour résilier votre abonnement envoyez un e-mail à l'adresse railsfrance...@googlegroups.com

---
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Railsfrance".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse railsfrance...@googlegroups.com.

Florian Dutey

unread,
Nov 23, 2016, 10:54:22 AM11/23/16
to rails...@googlegroups.com
1) tu veux imprimer quoi? /clients? C'est un listing?
2) Pourquoi creer une nouvelle route pour ca? Tu peux le gerer en ajoutant le format .pdf a ton index. /clients => html, /clients.pdf => la meme en pdf.

Maintenant regarde bien ton log Rails

ActionController::RoutingError (No route matches [POST] "/clients/print")

Pour une raison qui m'echappe (et je chercherai pas a savoir, je vomis les vues html en rails), ta vue soumet la requete en POST alors que ta route est en GET. Donc, corrige ta vue et tout ira bien <%= button_to 'print', print_clients_path, method: :get %>.
Ou mieux <%= button_to 'print', clients_path(format: :pdf), method: :get %>

Bye

--
--
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse rails...@googlegroups.com
Pour résilier votre abonnement envoyez un e-mail à l'adresse railsfrance-unsubscribe@googlegroups.com

---
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Railsfrance".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse railsfrance+unsubscribe@googlegroups.com.

Guillaume Betous

unread,
Nov 23, 2016, 2:52:12 PM11/23/16
to rails...@googlegroups.com
[HS]
 
et je chercherai pas a savoir, je vomis les vues html en rails

Alors là, je demande plus d'explications. Pas de sous-entendus, je ne comprends pas ce que tu veux dire par-là. Le rendu HTM est bien 99,9% de l'utilisation de Rails non ?

Merci :)

[/HS]

gUI

--
Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://www.libreoffice.org/download/

Florian Dutey

unread,
Nov 23, 2016, 8:52:22 PM11/23/16
to rails...@googlegroups.com
Lol, simple expression de mes gouts.
Mais si tu veux des raisons, je peux te donner une liste non exhaustive (on en decouvre de nouvelles tous les jours)

1) Mixer client et serveur dans lesquels y'a pas de tolerance, c'est pas bien, c'est mal, (ne serait ce que par respect pour le principe de single responsibility).
2) Les clients ont des etats independants du serveur. Rendre un document au format html cote serveur, ca passe. Rendre un interface cote serveur, c'est berk. 
3) ERB c'etait cool y'a 10 ans mais aujourd'hui on a de bien meilleurs framework pour les clients / vues. React et ses jsx est le meilleur selon moi, MEME pour rendre cote server (les requetes tapent un serveur node qui recupere le data en json sur le serveur rails et fait son rendering).
4) Les helpers rails pour les vues, c'est tres cool pour les developpers backend Ruby. Quand tu engages un pur ingenieur frontend pour s'occuper du front (ce qui parait logique), il doit apprendre a manipuler ERB. Pas cool, pour lui et pour le temps perdu (donc pour ton argent). Encore pire si tu utilises ce caca pourri qu'on appelle haml.
5) Les partials ne resolvent que partiellement (lol) les problemes de splitting de vues la ou l'approche composants de react est largement plus adaptee.
6) Asset pipeline c'est de la merde en barre compare a la concurrence (webpack pour n'en citer qu'un)

Bref, selon mon experience, le backend ca sert du data, pas des interfaces.

--

Guillaume Betous

unread,
Nov 24, 2016, 1:41:10 AM11/24/16
to rails...@googlegroups.com
Merci pour tout ça :)

gUI

ziburudebian

unread,
Nov 24, 2016, 4:23:17 AM11/24/16
to Railsfrance
merci florian, mais cela ne semble pas marcher;

pour info je ne fais pas du rhtml ou haml mais du slim mais je vais jeter un oeil sur react et ses jsx
concernant ma fonctionnalité du print je voulais sur un bouton print, disponible dans toutes mes vues de type index (show), lancer une 'impression' pdf avec wkhtmltopdf


Le mardi 22 novembre 2016 13:59:29 UTC+1, ziburudebian a écrit :
Reply all
Reply to author
Forward
0 new messages