JeuWeb - Crée ton jeu par navigateur
[Résolu][Rails] Créer un objet associé par belongs_to avec Active Record - 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] Créer un objet associé par belongs_to avec Active Record (/showthread.php?tid=5706)



[Résolu][Rails] Créer un objet associé par belongs_to avec Active Record - Maz - 24-09-2011

Bonjour!
Voici mon soucis, j'ai fait des associations d'active record à l'aide de has_many, has_one et belongs_to
Code :
class User < ActiveRecord::Base
    has_one :city
end

class City < ActiveRecord::Base
  belongs_to :user
  has_many :ants
end

class Ant < ActiveRecord::Base
  belongs_to :city
end
Je me retrouves avec une architecture d'associations sur trois étage qui ressembles dans ma tête à ça(de gauche à droite, de parent à enfant):
User > City > Ants.

Le premier objet qui est créé est User (à la connexion, en utilisant Authlogic). Et une fois l'utilisateur connecté, j'aimerais créé l'objet City via un formulaire. J'ai donc essayer quelques trucs, en vain:
class User::CitiesController < User:TongueanelController
def index
render :action => 'show'
end

def new
@city = City.new
end

def create
@city = current_user.city.create(params[:city])

respond_to do |format|
if @city.save
format.html { redirect_to [:user, @city], notice: 'Category was successfully created.' }
format.json { render json: @city, status: :created, location: @city }
else
format.html { render action: "show" }
format.json { render json: @city.errors, status: :unprocessable_entity }
end
end
end

def show
@city = current_user.city
end
end
le def index n'est utilisé que pour que l'instruction form_for @city fonctionnes. Il renvois à l'action show pour afficher l'objet city du current_user.

Le problème est que rien n'est enregistré dans la base de donnée, et une erreur m'es renvoyé dû au fait que l'objet current_user.city est inexistant dans l'action show.

EDIT: après une bonne après-midi de galère, j'ai enfin trouvé la solution =) la méthode à déquat était en fait current_user.crate_city à la place de current_user.city.create


RE: [Rails]Active Record Associations - Sephi-Chan - 25-09-2011

Boh ! Tu n'as pas lu l'API de belongs_to avec attention ! Ni la partie du guide belongs_to, d'ailleurs. C'est très, très vilain !

Concernant la structure de ton application, ça me semble un peu bizarre. Avoir une URL /user c'est un peu curieux. Ça risque de te jouer des tours dans la compréhension des mécanismes de ressources et de REST. Car là, ce que tu as dans ton action index n'est pas bien du tout. Si tu ne suis pas les conventions du framework, je te conseille de créer tes routes à la main (sans resources) : ce n'est pas vraiment plus long, tu y verras plus clair et ty auras seulement ce dont tu as besoin.

D'ailleurs, peux-tu coller ici le résultat du rake routes ?

Je vois que tu testes le retour de la méthode save après avoir utilisé create_city, ce n'est pas très logique car cette méthode crée l'objet. Mieux vaut utiliser build_city à la place, dans ton cas.

Pense à utiliser le tag code=Ruby plutôt que seulement code. C'est plus sympa pour ceux qui lisent le code (qui est alors coloré). Wink


RE: [Rails]Active Record Associations - Maz - 25-09-2011

(25-09-2011, 08:33 AM)Sephi-Chan a écrit : Boh ! Tu n'as pas lu l'API de belongs_to avec attention ! Ni la partie du guide belongs_to, d'ailleurs. C'est très, très vilain !

Concernant la structure de ton application, ça me semble un peu bizarre. Avoir une URL /user c'est un peu curieux. Ça risque de te jouer des tours dans la compréhension des mécanismes de ressources et de REST. Car là, ce que tu as dans ton action index n'est pas bien du tout. Si tu ne suis pas les conventions du framework, je te conseille de créer tes routes à la main (sans resources) : ce n'est pas vraiment plus long, tu y verras plus clair et ty auras seulement ce dont tu as besoin.

D'ailleurs, peux-tu coller ici le résultat du rake routes ?

Je vois que tu testes le retour de la méthode save après avoir utilisé create_city, ce n'est pas très logique car cette méthode crée l'objet. Mieux vaut utiliser build_city à la place, dans ton cas.

Pense à utiliser le tag code=Ruby plutôt que seulement code. C'est plus sympa pour ceux qui lisent le code (qui est alors coloré). Wink

J'ai survoler les deux liens que tu me proposes.
Je suis conscient que le scope /user peut poser des soucis même à moi personellement car je me retrouves par exemple dans les views avec un dossier /users qui contient tout ce qui est connexion, inscription, etc... et un dossier /user qui est juste un scope pour le panel d'utilisateur, je comptes y remédier desuite. Mon rake routes est le suivant, je viens tout juste de l'amélioré.
Code :
root        /                                      {:controller=>"application", :action=>"index"}
             signup        /signup(.:format)                      {:action=>"new", :controller=>"users"}
   activate_account        /activate(/:activation_code)(.:format) {:controller=>"activations", :action=>"create"}
    password_resets POST   /password_resets(.:format)             {:action=>"create", :controller=>"password_resets"}
new_password_reset GET    /password_resets/new(.:format)         {:action=>"new", :controller=>"password_resets"}
edit_password_reset GET    /password_resets/:id/edit(.:format)    {:action=>"edit", :controller=>"password_resets"}
     password_reset PUT    /password_resets/:id(.:format)         {:action=>"update", :controller=>"password_resets"}
             logout        /logout(.:format)                      {:action=>"destroy", :controller=>"user_sessions"}
              login        /login(.:format)                       {:action=>"new", :controller=>"user_sessions"}
      user_sessions GET    /user_sessions(.:format)               {:action=>"index", :controller=>"user_sessions"}
                    POST   /user_sessions(.:format)               {:action=>"create", :controller=>"user_sessions"}
   new_user_session GET    /user_sessions/new(.:format)           {:action=>"new", :controller=>"user_sessions"}
  edit_user_session GET    /user_sessions/:id/edit(.:format)      {:action=>"edit", :controller=>"user_sessions"}
       user_session GET    /user_sessions/:id(.:format)           {:action=>"show", :controller=>"user_sessions"}
                    PUT    /user_sessions/:id(.:format)           {:action=>"update", :controller=>"user_sessions"}
                    DELETE /user_sessions/:id(.:format)           {:action=>"destroy", :controller=>"user_sessions"}
              users GET    /users(.:format)                       {:action=>"index", :controller=>"users"}
                    POST   /users(.:format)                       {:action=>"create", :controller=>"users"}
           new_user GET    /users/new(.:format)                   {:action=>"new", :controller=>"users"}
               user GET    /users/:id(.:format)                   {:action=>"show", :controller=>"users"}
    edit_panel_user GET    /panel/user/edit(.:format)             {:action=>"edit", :controller=>"users"}
         panel_user PUT    /panel/user(.:format)                  {:action=>"update", :controller=>"users"}
                    DELETE /panel/user(.:format)                  {:action=>"destroy", :controller=>"users"}
         panel_root        /panel(.:format)                       {:controller=>"panel/panel", :action=>"index"}
         panel_city POST   /panel/city(.:format)                  {:action=>"create", :controller=>"panel/cities"}
     new_panel_city GET    /panel/city/new(.:format)              {:action=>"new", :controller=>"panel/cities"}
         panel_city        /panel/city(.:format)                  {:action=>"index", :controller=>"panel/cities"}
                    GET    /panel/cities/:id(.:format)            {:action=>"show", :controller=>"panel/cities"}
         panel_ants GET    /panel/ants(.:format)                  {:action=>"index", :controller=>"panel/ants"}
                    POST   /panel/ants(.:format)                  {:action=>"create", :controller=>"panel/ants"}
      new_panel_ant GET    /panel/ants/new(.:format)              {:action=>"new", :controller=>"panel/ants"}
          panel_ant GET    /panel/ants/:id(.:format)              {:action=>"show", :controller=>"panel/ants"}