Rutas anidadas y form_for y modelos usando has_one y belongs_to

¿Cómo asignar un modelo has_one con rutas anidadas y cómo agregar un form_for para /localhost:3000/users/1/profile/new,html.erb siguiendo la base de datos RESTful?

El usuario tiene un perfil.

Modelos

class Profile < ActiveRecord::Base attr_accessible :name, :surname belongs_to :user end class User < ActiveRecord::Base attr_accessible :email, :email_confirmation, :password, :password_confirmation has_secure_password has_one :profile, dependent: :destroy end resources :users do resources :profiles (note: has_one profile) resources :progress_charts resources :calories_journals end 

vistas / perfiles / nuevo.html.erb

 

About You

controller: Profiles_controller.rb Dos errores que he descubierto porque no entiendo bien por qué no funcionaba.

 class ProfilesController < ApplicationController def index end def show end def new # @user = User.find(params[:id]) # Error message: Couldn't find User without an ID # @profile = @user.build_profile() @profile = current_user.build_profile(params[:id]) # Error message: unknown attributes: user_id end def edit end def create end def update end def destroy end end 

Ayudantes: SessionHelper (para ilustrar current_user) módulo SessionsHelper def sign_in (usuario) cookies.permanent [: remember_token] = user.remember_token self.current_user = user end

  def signed_in? !current_user.nil? end def current_user=(user) @current_user = user end def current_user?(user) user == current_user end def current_user @current_user ||= User.find_by_remember_token(cookies[:remember_token]) end def sign_out self.current_user = nil cookies.delete(:remember_token) end def signed_in_user unless signed_in? store_location redirect_to signin_path, notice: "Please sign in." end end end 

¿Su tabla de perfiles tiene un atributo user_id?

En sus rutas, el perfil debe ser singular, ya que un usuario tiene un perfil:

 resources :users do resource :profile resources :progress_charts resources :calories_journals end 

La ruta a un perfil de usuario será users/:user_id/profile (y no users/:user_id/profile/:id

En su profile_controller:

 @profile = current_user.build_profile(params[:id]) # why params[:id]? #it should just be @profile = current_user.build_profile() @user = User.find(params[:user_id]) 

Y la forma sería algo como:

 form_for [@user, @profile] do |f|... end 

¿Realmente quieres que el usuario cree su perfil de esa manera? Usualmente, crearías el perfil cuando un usuario se registre.