Couldn't find Group without an ID

Bonjour,

J’ai un petit problème avec l’update dans mon contrôleur
contacts_controller.rb".
Pour resituer le contexte, je dispose de deux modèles “contact” et
“group” auxquels sont associés deux contrôleurs “contacts_controller.rb”
et “groups_controller.rb”. Un groupe peut avoir plusieurs contacts, un
contact est associé à un seul groupe (cf tutoriel =>
http://www.buzzdenoel.fr/tutoriel-ruby-on-rails.html).

Quand je souhaite mettre à jour le contact 28 du groupe 1, j’obtiens
toujours un message d’erreur :

" ActiveRecord::RecordNotFound in ContactsController#update

Couldn’t find Group without an ID"

http://localhost:3000/groups/1/contacts/28/edit => Vue edit.erb.html
contenant :

Modifier le contact "<%=h @contact.name %>"du groupe "<%=h @group.name %>"

 

<% form_for(@contact) do |f| %> <% @contact.group_id = @group.id %>

<%= hidden_field :group_id , :group_id, :value => @group.id %>

Nom : <%= f.text_field :name, :size=>'20' %>

Telephone : <%= f.text_field :phone_number, :size=>'10' %>

Adresse : <%= f.text_field :address, :size=>'50' %>

<%= f.submit 'Mettre à jour' %> <% end %>


<%= link_to 'Retour',group_path(@group.id)+'/contacts' %>  |  <%= link_to 'Consulter',group_path(@group.id)+contact_path(@contact) %>  |  <%= link_to 'Supprimer',group_path(@group.id)+contact_path(@contact),:method => :delete,:confirm => 'Etesvous sur de vouloir supprimer cet élément ?' %>

Pourtant, dans request parameters, j’ai bien :

{“_method”=>“put”,
“authenticity_token”=>“5535d229b55227e382c76c6a144fcf42c341a868”,
“group_id”=>{“group_id”=>“1”},
“contact”=>{“name”=>“marcel”,
“phone_number”=>“0577554433”,
“address”=>“rue des rien 34000 Montpellier”},
“commit”=>“Mettre à jour”,
“id”=>“28”}

Voici le contenu de mon controleur “contacts_controller.rb” :

class ContactsController < ApplicationController
before_filter :find_group

def index
@contacts = Contact.find :all, :order => “name ASC”
end

def show
@contact = Contact.find params[:id]
end

def new
@contact = Contact.new
end

def create
@contact = Contact.new params[:contact]
@contact.group = @group
if @contact.save
flash[:notice] = “Le contact a été créé avec succès”

  redirect_to groups_contacts_path(@group)
else
  render :action => "new"
end

end

def edit
#id designe l’identifiant contact
@contact = Contact.find params[:id]
mon_fichier = File.open(“test.txt”, “w”)
mon_fichier.write @contact.name
mon_fichier.close
end

def update

#je recupere le contact qui a l id = ID
@contact = Contact.find params[:id]

mon_fichier2 = File.open(“testBis.txt”, “w”)
mon_fichier2.write @contact.name
mon_fichier2.close
#mettre a jour tous les attributs
if @contact.update_attributes params[:contact]

  flash[:notice] = "Le contact a été modifié avec succès"

  redirect_to 'groups_path'
else
  render :action => "edit"
end

end

def destroy
@contact = Contact.find params[:id]
@contact.destroy

#bonne adresse /groups/id/contacts (menu
redirect_to group_path(@contact.group_id)+'/contacts'

end

private

def find_group
@group = Group.find params[:group_id]
end
end

J’ai le même problème avec l’insertion ? Je vois pas vraiment d’ou vient
le problème… Je débute donc…

Babiben A. wrote:

Quand je souhaite mettre à jour le contact 28 du groupe 1, j’obtiens

Modifier le contact "<%=h @contact.name %>"du groupe "<%=h <% end %>

“commit”=>“Mettre à jour”,

end
end
end

def edit
#id designe l’identifiant contact
@contact = Contact.find params[:id]

Contact.find(28) exist vraiment ?


Cyril M.

Le 10 mars 2009 15:36, Babiben a écrit :

Dans ton formulaire, ça c’est pas bon :

<%= hidden_field :group_id , :group_id, :value => @group.id %>

Pour s’en convaincre, tu peux comparer le code HTML généré
avec celui généré par :

Nom : <%= f.text_field :name, :size=>'20' %>

Pourtant, dans request parameters, j’ai bien :

{“_method”=>“put”,
“authenticity_token”=>“5535d229b55227e382c76c6a144fcf42c341a868”,
“group_id”=>{“group_id”=>“1”},
“contact”=>{“name”=>“marcel”,
“phone_number”=>“0577554433”,
“address”=>“rue des rien 34000 Montpellier”},
“commit”=>“Mettre à jour”,
“id”=>“28”}

Ouais mais c’est pas bon, tu vois bien qu’il y a un problème avec :

“group_id”=>{“group_id”=>“1”},

Ce que tu veux c’est :

“contact”=>{“name”=>“marcel”,
“phone_number”=>“0577554433”,
“group_id”=>“1”,

i.e. params[:contact][:group_id] et non
params[:group_id][:group_id]

– Jean-François.


http://twitter.com/underflow_

“group_id”=>{“group_id”=>“1”},

Ce que tu veux c’est :

“contact”=>{“name”=>“marcel”,
“phone_number”=>“0577554433”,
“group_id”=>“1”,

En fait, j’ai besoin de id (l’identifiant de mon contact) mais aussi de
group_id (le groupe auquel appartient le contact).

Ce que je veux, c’est

“contact”=>{“group_id” => “1”,
name => “marcel”

“id”=>“28”)

bonjour

<%= f.hidden_field :group_id %>

sinon si tu utilise les nested resources tu devrais une route du style
groups/1/users/new du coups tu as toujours params[:group_id]

2009/3/10 Babiben A. [email protected]

Le 10 mars 2009 16:16, Babiben a écrit :

En fait, j’ai besoin de id (l’identifiant de mon contact) mais
aussi de group_id (le groupe auquel appartient le contact).

Ce que je veux, c’est

“contact”=>{“group_id” => “1”,
name => “marcel”

“id”=>“28”)

Eh oh, le newbie, tu me cherches ou quoi là ?

J’ai mis des points de suspension, c’est pour des prunes ?

– Jean-François.


http://twitter.com/underflow_

Eh oh, le newbie, tu me cherches ou quoi l� ?

J’ai mis des points de suspension, c’est pour des prunes ?

Non mais t’énerves pas. Je suis juste un peu tête en l’air… J’ai pas
fait attention.

En tout cas, le newbie, il ne trouve pas la solution. Avec le système de
champ caché, j’obtiens bien mon :

“contact”=>{“group_id”=>“1”,
“name”=>“oooo”,
“phone_number”=>“0612453643”,
“address”=>“rue des newbie as me”},
“commit”=>“Inserer”}

Le problème, c’est au niveau du traitement de ces données :

En théorie, le contrôleur appelle la méthode “create” ? :
JE récupère les infos et crée un nouveau contact et si c’est ok, je
l’intègre à ma base de données? Je suis redirigé vers la page listant
les groupes…
Sinon, je fais appel à la méthode new => Contact.new ?

def create
@contact = Contact.new params[:contact]

if @contact.save
  flash[:notice] = "Le contact a été créé avec succès"

  redirect_to groups_path
else
  render :action => "new"
end

end

petite note en plus : regarde l’episode 139 de ryan bates

2009/3/10 guillaume belleguic [email protected]

je sais j’insiste mais regarde les nested ressource …<% form_for
[@group,
@user] do |f| -%>

<% end -%>
def create
@contact = @group.contacts.new(params[:contact])
end

grace au before_filter tout vas bien tu doit avoir un group
ah et pense au parenthèse dans les méthodes comme find et new (c’est un
conseil a toi de voir…)

2009/3/10 Babiben A. [email protected]

guillaume belleguic a écrit :

petite note en plus : regarde l’episode 139 de ryan bates

Ou ce tutoriel:
http://adam.blog.heroku.com/past/2007/12/20/nested_resources_in_rails_2/

Prérequis: comprendre les REST routes simples.

guillaume belleguic wrote:

je sais j’insiste mais regarde les nested ressource …<% form_for
[@group,
@user] do |f| -%>

<% end -%>
def create
@contact = @group.contacts.new(params[:contact])
end

grace au before_filter tout vas bien tu doit avoir un group
ah et pense au parenthèse dans les méthodes comme find et new (c’est un
conseil a toi de voir…)

2009/3/10 Babiben A. [email protected]

Ok merci beaucoup ça fonctionne :wink: