2010-12-11 6 views
1

Je voulais créer un réseau social très simple. J'ai commencé avec deux modèles: Utilisateur (en utilisant Devise gem) et son profil. Ils sont reliés par la relation 1-à-1, donc mes itinéraires ressembler à:Impossible d'ajouter des validations dans un modèle de ressource unique dans Rails 3

resources :users do 
    resource :profile 
end 

je un contrôleur approprié - voici le code pour créer le profil (l'édition est à peu près le même):

def new 
    @profile = current_user.create_profile 
end 

def create 
    @profile = current_user.profile.create(params[:profile]) 
    if @profile.save 
     redirect_to user_profile_path(current_user) 
    else 
     render :action => "new" 
    end 
end 

J'ai utilisé la variable current_user, car l'utilisateur n'est pas autorisé à créer un profil pour quelqu'un d'autre, peu importe ce qu'il tape dans la barre d'adresse.

Dans la « nouvelle » vue que j'ai une forme:

- form_for [@profile.user, @profile] do |p| 
    (fields omitted) 

Il travaille comme je m'y attendais - les utilisateurs peuvent ajouter leurs données aux profils et après avoir frappé « Enregistrer » sont redirigés vers leur nouveau page. Cependant, lorsque je tente d'ajouter quelques validations au modèle de profil (même les plus simples, comme validates_presence_of), puis créer un nouveau profil, mon contrôleur me montre une erreur:

undefined method `user_profiles_path' for #<#<Class:0xb2d3e5c>:0xb2d2728> 

Extracted source (around line #1): 
1: - form_for [@profile.user, @profile] do |p| 

Il est étrange, mais ce problème ne se produire lors de la mise à jour des informations de profil, seulement en essayant de créer un nouveau. J'ai googlé une solution me disant de spécifier l'URL de redirection dans form_for helper. Donc, je l'ai changé à mon avis:

- form_for [@profile.user, @profile], :url => user_profile_path(@profile.user) do |p| 

Cela ne fonctionne toujours pas. Il affiche la vue que je voulais (avec un message d'erreur de validation dès le début, mais je pourrais vivre avec ça ;-)), mais après avoir frappé « Enregistrer » il produit un autre problème:

undefined method `create' for nil:NilClass 

Je trouve même plus étrange, car il affiche l'objet du paramètre dans les détails de l'erreur, il contient les bonnes données et est tout sauf nul. J'ai manqué d'idées, ce qui peut être faux.

Je suis un peu curieux. Qu'est-ce qui cause mon problème et comment le réparer?

Merci d'avance!

+0

Essayez de ne pas poser une question à la fois s'il vous plaît –

Répondre

0

Essayez

@profile = current_user.create_profile(params[:profile]) 

Dans votre action de création - au lieu de .profile.create

+0

Il ne cesse de dire "méthode non définie pour néant", mais cette fois il ne peut pas trouver "create_profile". – Elrosa

+0

Eh bien dans ce cas, il semble que current_user est nul! – Cory

0

Je suggère ce qui suit:

# user.rb 
    def initialize(*params) 
    super(*params) 
    self.build_profile unless self.profile 
    end 
0

Première: Assurez-vous qu'il ya un current_user, exiger l'utilisateur à connecter.

Deuxième: Vous obtenez la méthode user_profiles_path sur new car le profil n'est pas conservé. La méthode de génération d'URL dans les rails sera pluralisée dans ce cas. Si vous voulez utiliser l'URL correcte, utilisez: [@profile.user, :profile]. Vous pouvez le faire, car il n'y a qu'un seul profil par utilisateur et l'ID de profil n'est pas nécessaire.

Troisième: Dans votre action de création, remplacez

@profile = current_user.profile.create(params[:profile]) 
# with 
@profile = current_user.build_profile(params[:profile]) 

Dernière: Ne tenez pas compte ayant une différence entre la création et la modification du profil. Pour votre utilisateur final, cela ne fera aucune différence. Vous pouvez ajouter dans un filtre avant la création d'un profil vide, au cas où il serait manquant. Ce sera aussi moins de code pour vous.

Questions connexes