User & Profile w/ Devise

I am using Devise and am trying to allow each user to create 1 profile
(they can currently make many). I am able to send the the newly
registered user to the page where they can create a profile, but when
the User logs in it will not go to the Profile Show page - the error
message is

(Couldn’t find Profile without an ID…
app/controllers/profiles_controller.rb:16:in `show’)

The code (sorted by files) is below…

user.rb

== Schema Information

Table name: users

id :integer not null, primary key

email :string(255) default(""), not null

encrypted_password :string(255) default(""), not null

reset_password_token :string(255)

reset_password_sent_at :datetime

remember_created_at :datetime

sign_in_count :integer default(0)

current_sign_in_at :datetime

last_sign_in_at :datetime

current_sign_in_ip :string(255)

last_sign_in_ip :string(255)

created_at :datetime not null

updated_at :datetime not null

class User < ActiveRecord::Base

Include default devise modules. Others available are:

:token_authenticatable, :confirmable,

:lockable, :timeoutable and :omniauthable

devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable

Setup accessible (or protected) attributes for your model

attr_accessible :email, :password, :password_confirmation,
:remember_me

attr_accessible :title, :body

has_one :profile
end


profile.rb

== Schema Information

Table name: profiles

id :integer not null, primary key

user_id :integer

first_name :string(255)

last_name :string(255)

created_at :datetime not null

updated_at :datetime not null

class Profile < ActiveRecord::Base
attr_accessible :first_name, :last_name

belongs_to :user
end


profiles_controller.rb

class ProfilesController < ApplicationController

GET /profiles

GET /profiles.json

def index
@profiles = Profile.all

respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @profiles }
end

end

GET /profiles/1

GET /profiles/1.json

def show
@profile = Profile.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.json { render json: @profile }
end

end

GET /profiles/new

GET /profiles/new.json

def new
@profile = Profile.new

respond_to do |format|
  format.html # new.html.erb
  format.json { render json: @profile }
end

end

GET /profiles/1/edit

def edit
@profile = Profile.find(params[:id])
end

POST /profiles

POST /profiles.json

def create
@profile = Profile.new(params[:profile])

respond_to do |format|
  if @profile.save
    format.html { redirect_to @profile, notice: 'Profile was

successfully created.’ }
format.json { render json: @profile, status: :created, location:
@profile }
else
format.html { render action: “new” }
format.json { render json: @profile.errors, status:
:unprocessable_entity }
end
end
end

PUT /profiles/1

PUT /profiles/1.json

def update
@profile = Profile.find(params[:id])

respond_to do |format|
  if @profile.update_attributes(params[:profile])
    format.html { redirect_to @profile, notice: 'Profile was

successfully updated.’ }
format.json { head :no_content }
else
format.html { render action: “edit” }
format.json { render json: @profile.errors, status:
:unprocessable_entity }
end
end
end

DELETE /profiles/1

DELETE /profiles/1.json

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

respond_to do |format|
  format.html { redirect_to profiles_url }
  format.json { head :no_content }
end

end
end


registrations_controller.rb

class RegistrationsController < Devise::RegistrationsController
protected

def after_sign_up_path_for(resource)
request.env[‘omniauth.origin’] || stored_location_for(resource) ||
new_profile_path
end

end


application_controller.rb

class ApplicationController < ActionController::Base
def after_sign_in_path_for(resource)
request.env[‘omniauth.origin’] || stored_location_for(resource) ||
show_path
end
end


routes.rb

BaseApp::Application.routes.draw do
resources :profiles

get “users/show”

devise_for :users, :controllers => { :registrations => “registrations”
}
resources :users

match ‘/show’, to: ‘profiles#show’

match ‘/signup’, to: ‘users#new’

root to: ‘static_pages#home’

match ‘/’, to: ‘static_pages#home’


end

Have you checked that profile id is being passed in params[:id]?

KUL KING wrote in post #1077336:

Have you checked that profile id is being passed in params[:id]?

How ought I check this?

jason baguio wrote in post #1077357:

KUL KING wrote in post #1077336:

Have you checked that profile id is being passed in params[:id]?

How ought I check this?

I changed changed the application_controller.rb to:

class ApplicationController < ActionController::Base
def after_sign_in_path_for(resource)
request.env[‘omniauth.origin’] || stored_location_for(resource) ||
show_path(resource.profile)
end
end

I signed up a new User and then created a Profile. After I logged out
and signed back in it gave me the error:

ActiveRecord::RecordNotFound in ProfilesController#show

Couldn’t find Profile without an ID

Any thoughts on the issue?

On 09/24/2012 01:18 PM, jason baguio wrote:

I am using Devise and am trying to allow each user to create 1
profile (they can currently make many). I am able to send the the
newly registered user to the page where they can create a profile,
but when the User logs in it will not go to the Profile Show page

  • the error message is

(Couldn’t find Profile without an ID…
app/controllers/profiles_controller.rb:16:in `show’)

We dealt with a similar problem by making sure that a profile was
created for every user at the time the user is created; we did this in
the model after failing to convince the controller to do the right
thing.

In app/models/user.rb:

before_save do | user |
user.profile = Profile.new unless user.profile
end

HTH,
Chris

Chris Maden, text nerd <URL: http://crism.maden.org/ >
LIVE FREE: vote for Gary Johnson, Libertarian for President.
<URL: http://garyjohnson2012.com/ > <URL: http://lp.org/ >
GnuPG fingerprint: DB08 CF6C 2583 7F55 3BE9 A210 4A51 DBAC 5C5C 3D5E