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
on 2012-09-24 19:18
on 2012-09-24 22:43
KUL KING wrote in post #1077336:
> Have you checked that profile id is being passed in params[:id]?
How ought I check this?
on 2012-09-24 23:09
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 2012-09-25 23:07
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
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.