S'il vous plaît voir les mises à jour au bas de la question ...
Pour référence, ce problème a évolué de certains correctifs que j'ai fabriqués sur la base d'un problème précédent que j'avais ici: Associant deux modèles dans des rails (utilisateur et profil) p>
Je construis un bâtiment app qui a un modèle utilisateur et un modèle de profil. p>
Je veux associer ces modèles tels que:
- Une fois que l'utilisateur crée un compte, il est automatiquement envoyé à la page "Créer un profil" et que le profil qu'il crée est connecté à cet utilisateur particulier.
- Seul l'utilisateur qui possède le profil peut le modifier. P>
J'ai généré le modèle d'utilisateur à l'aide de Nifty_Generators. Lorsque l'utilisateur frappe la création de compte, je le redirige dans la vue "Nouveau profil" pour créer un profil. Je l'ai fait en édité le chemin de redirection dans le contrôleur de l'utilisateur. Le contrôleur de l'utilisateur ressemble à ceci: p>
<div id="posts"> <% @users.each do |profile| %> <div class="post"> <div class="left"> <p>Store: </p> <p>Category: </p> </div> <div class="right"> <p><%=h profile.name %></p> <p><%=h profile.category %></p> </div> <div class="bottom"> <p><%= link_to 'Go to profile', user_profile_path(@user, profile) %></p> <p><%= link_to 'Edit', edit_user_profile_path(@user, profile) %></p> <p><%= link_to 'Destroy', user_profile_path(@user, profile), :confirm => 'Are you sure?', :method => :delete %></p> </div> </div>
4 Réponses :
L'erreur vous indique que dans cette ligne: @ user.profile est nul. p> puisque vous n'avez pas encore créé le profil, cela fait sens. Au lieu de cela, allez chercher quelque chose comme ça. P> re: la page d'index lancant une exception. Strong> P> vous définissent des @users dans votre contrôleur, puis référencez-vous @user dans vos aides de chemin. En outre, itérant sur @userers devrait vous donner des objets utilisateur, pas les objets de profil. P> On dirait que vous essayez d'utiliser l'action d'index du profil pour afficher une liste des utilisateurs. C'est un peu d'accord, d'une manière non assez purée. Cependant, je m'attendrais à voir quelque chose de plus comme ça. P>
<% @users.each do |user| -%>
<% unless user.profile.blank? -%>
<%= h user.profile.name %>
<%= h user.profile.category %>
<%= link_to 'Go to profile', user_profile_path(user, user.profile) %>
<% end -%>
<% end -%>
Bien celui qui a baissé cela devrait expliquer pourquoi ... je pense que c'est une supposition raisonnable
JDL, quand je fais votre changement, je reçois l'exception suivante: actionview :: templateError (méthode non définie `user_profiles_path 'for #
C'est ce qui cause le problème, mais je ne sais pas comment le réparer: <% Form_for ([[Utilisateur, @Profile]) Do | F | %>
J'ai essayé de supprimer le @user, mais cela n'a pas fonctionné. Suggestions?
Pouvez-vous poster nouvelle.html.erb et votre fichier routes.rb? Cela devrait être assez facile à suivre, mais cela devine simplement que si nous ne pouvons voir le code en question.
@jdl était correct en ce qu'il n'y ait aucun objet @ user.profile dans le profilecontroller # nouveau alors appeler @ user.profile.build lancerait une exception nulle.
Vous pouvez résoudre ce problème en instanciant un nouvel objet de profil par plus tard si @user est enregistré, il déclenche un @ user.profile et les clés étrangères seront définies de manière appropriée. P> aussi dans votre profilecontroller, Les actions #index et #Show sont une sorte d'étrange. Conventionnellement, l'action #index renvoie une "liste d'objets" et #show est d'afficher un seul objet, un identifiant spécifique donné d'un identifiant. Cependant, votre #index renvoie un objet très spécifique car il fait un utilisateur.Find avec un identifiant spécifique. De plus, étant donné qu'un utilisateur n'a qu'un objet de profil, il n'a pas de sens de charger également son objet de profil avec une commande par. Il ne devrait y avoir qu'un seul ordre n'est nécessaire. En plus de cela, c'est discutable si vous devez charger explicitement l'objet de profil, car vous pouvez simplement y accéder via @ user.Profile et Activerecord le chargera à la demande. Donc, votre nouveau #index ressemble à quelque chose comme p> Ceci suppose que vous avez le plug-in WillPaginate, mais le gist est que vous chargez une liste d'objets, pas seulement un. À votre avis, si vous êtes itérant sur @users et appelez .Profile sur un élément de cette liste, alors Activerecord chargera le profil associé à la volée. P> la même chose pour #show - pas besoin d'explicitement Chargez le profil. P> def show
@user = User.find(params[:user_id])
end
Cody, dans votre explication, où va exactement cette ligne? @ user.profile = profil.New
hmm .. Je pensais que lorsque l'utilisateur a de nombreux profils, vous pouvez ensuite utiliser: Lorsque l'utilisateur dispose d'un profil, vous devez utiliser: p> @user.build_profile
@user.create_profile
faire une chose
in
in profilecontroller code> fournir
Session [: user_id] code> pas
paramètres [: user_id] p >
def show <br>
@user = User.find(session[:user_id])<br>
@profile = @user.profile <br>
end <br>
À quoi ressemblent vos itinéraires? Spécifiquement pour les utilisateurs et les profils
Peut-être: redirect_to new_user_profile_path (: user_id => @ user.id)
Grande question, btw. Bien écrit avec la bonne quantité de code exemple et une explication claire du problème. Les nouveaux utilisateurs prennent note.
Cody, j'ai ceci dans le fichier routes.rb: map.Resources: utilisateurs,: has_one =>: profil