ActiveRecord::RecordNotFound — impossible de trouver de l'Utilisateur sans une ID

Veuillez voir les MISES à jour sur le fond de la question...

De référence, ce problème s'est développée à partir de certains des correctifs j'ai fait après un problème que j'ai ici: Associe dans ce cas des Deux Modèles dans les Rails (utilisateur et profil)

Je suis en train de construire une application qui a un modèle d'utilisateur et un modèle de profil.

Je veux associer ces modèles tels que:
- Après l'utilisateur crée un compte, il est automatiquement envoyé à l' "créer un profil" de la page, et le profil qu'il a crée est connecté qu'à cet utilisateur.
- Seul l'utilisateur qui possède le profil peut le modifier.

J'ai généré le modèle de l'utilisateur à l'aide de nifty_generators. Lorsque l'utilisateur clique sur soumettre pour la création de compte, je redirige lui pour le "nouveau profil" pour créer un profil. Je l'ai fait en modifiant le chemin de redirection de l'utilisateur du contrôleur. L'utilisateur contrôleur ressemble à ceci:

def new
  @user = User.new
end

def create
  @user = User.new(params[:user])
  if @user.save
    session[:user_id] = @user.id
    flash[:notice] = "Thank you for signing up! You are now logged in."
    redirect_to new_user_profile_path(:user_id => @user)
  else
    render :action => 'new'
  end
end

Lorsque je clique sur "envoyer" pour créer un nouvel utilisateur, il m'envoie à l'adresse url suivante, qui me semble bon: localhost:3000/utilisateurs/6/profil/nouveau. Mais il jette l'exception suivante:

NoMethodError dans
ProfilesController#new Vous avez un
nul objet lorsque vous ne vous attendiez pas!
L'erreur s'est produite lors de l'évaluation de
néant.construire

La trace indique que le problème est dans les profils de contrôleur, dans la Nouvelle méthode. Les profils contrôleur ressemble à ceci:

def index
  @user = User.find(params[:user_id])
  @profile = @user.profile(:order => "created_at DESC")
end

def show
  @user = User.find(params[:user_id])
  @profile = @user.profile.find(params[:id])
end

def new
  @user = User.find(params[:user_id])
  @profile = @user.profile.build
end

def edit
  @user = User.find(params[:user_id])
  @profile = @user.profile.find(params[:id])
end

def create
  @user = User.find(params[:user_id])
  @profile = @user.profile.build(params[:profile])
    if @profile.save
      flash[:notice] = 'Profile was successfully created.'
      redirect_to(@profile)
    else
      flash[:notice] = 'Error.  Something went wrong.'
      render :action => "new"
    end
end

En outre, l'application déclenche une exception lorsque j'essaie d'afficher la page d'index des profils (il n'existe actuellement pas de profils parce que je ne peux pas obtenir au-delà de l'utilisateur étape de création pour créer un). C'est l'exception:
ActiveRecord::RecordNotFound dans ProfilesController#index
Impossible de trouver de l'Utilisateur sans un ID

C'est ce que le journal est de me dire:

Traitement ProfilesController#index
[GET] Paramètres:
{"action"=>"index",
"contrôleur"=>"profils"}

ActiveRecord::RecordNotFound (ne Pouvait pas
trouver de l'Utilisateur sans une pièce d'identité):
app/controllers/profiles_controller.rb:5:dans
`index'

Pour vous donner le reste des détails sur l'application, les modèles, les associations suivantes:
Profil appartient _to :l'utilisateur
L'utilisateur a _one :profil

J'ai ceci dans les itinéraires.rb fichier: carte.ressources :utilisateurs :has_one => :profil

Dans la vue de la nouvelle page de profil que de lancer la première exception énumérés ci-dessus, j'ai ceci:

<% form_for([@user, @profile]) do |f| %>
  <%= f.error_messages %>
....
<% end %>  

Dans l'affichage du profil d'indice qui lance la deuxième exception est expliqué ci-dessus, j'ai ceci:

<% @profiles.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>

J'ai passé des heures à essayer de traquer le problème moi-même comme un exercice d'apprentissage, mais à ce point je n'ai aucune idée de comment résoudre ce problème. Apprécions l'aide!

Mise à JOUR:

jdl, selon votre demande:
des profils nouveaux.html.erb:

<% form_for([@user, @profile]) do |f| %>
  <%= f.error_messages %>



<div class="left">
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>required
  </p>
    <p>
    <%= f.label :category %><br />
    <%= f.text_field :category %>required
  </p>
  <p>
    <%= f.label :address1 %><br />
    <%= f.text_field :address1 %>
  </p>
  <p>
    <%= f.label :address2 %><br />
    <%= f.text_field :address2 %>
  </p>
  <p>
    <%= f.label :city %><br />
    <%= f.text_field :city %>
  </p>
  <p>
    <%= f.label :state %><br />
    <%= f.text_field :state %>
  </p>
  <p>
    <%= f.label :zip %><br />
    <%= f.text_field :zip %>required
  </p>
  <p>
    <%= f.label :phone %><br />
    <%= f.text_field :phone %>
  </p>
  <p>
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </p>

  </div>

  <div class="right">
  <p>
    <%= f.label :website %><br />
    <%= f.text_field :website %>
  </p>
  <p>
    <%= f.label :description %><br />
    <%= f.text_area :description %>
  </p>
  </div>

  <p>
    <%= f.submit 'Create' %>
  </p>
    <% end %> 

routes.rb:
ActionController::Routage::Itinéraires.tirage n' |map|
carte.l'inscription 'inscription', :controller => 'utilisateurs', :action => 'nouveau'
carte.quitter "quitter", : controller => "sessions", : action => 'détruire'
carte.login 'login', :controller => "sessions", : action => 'nouveau'
carte.ressources :des séances de

  map.resources :users, :has_one => :profile  

  map.root :controller => "home"   
  map.connect ':controller/:action/:id'  
  map.connect ':controller/:action/:id.:format'  
end  

PROFILS CONTRÔLEUR (comme de 8/20/09, 8pm EST)
classe ProfilesController < ApplicationController

  def index
    @users = User.all(:order => "created_at DESC")
  end

  def show
    @user = User.find(params[:user_id])
  end

  def new
    @user.profile = Profile.new
  end

  def edit
    @user = User.find(params[:user_id])
    @profile = @user.profile.find(params[:id])
  end

  def create
    @user = User.find(params[:user_id])
    @profile = @user.profile.build(params[:profile])
      if @profile.save
        flash[:notice] = 'Profile was successfully created.'
        redirect_to(@profile)
      else
        flash[:notice] = 'Error.  Something went wrong.'
        render :action => "new"
      end
  end

  def update
    @profile = Profile.find(params[:id])
      if @profile.update_attributes(params[:profile])
        flash[:notice] = 'Profile was successfully updated.'
        redirect_to(@profile)
      else
        render :action => "edit"
      end
  end

  def destroy
    @profile = Profile.find(params[:id])
    @profile.destroy
      redirect_to(profiles_url)
  end
end

Cody, la page d'index ci-dessous est de lancer l'exception suivante:
NoMethodError dans les Profils#index
Montrant app/views/profils/index.html.erb où la ligne n ° 14 posée:
undefined method `nom' #

    <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> 
Que faire de vos routes? Spécifiquement pour les utilisateurs et les profils
peut-être: redirect_to new_user_profile_path(:user_id => @user.id)
La grande question, btw. Bien écrit, avec la bonne quantité de code en exemple et une explication claire du problème. Les nouveaux utilisateurs d'en prendre note.
Cody, j'ai ceci dans les itinéraires.rb fichier: carte.ressources :utilisateurs :has_one => :profil

OriginalL'auteur MikeH | 2009-08-20