Forum: Ruby on Rails User & Profile w/ Devise

Posted by jason baguio (jlbaguio)
on 2012-09-24 19:18
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
Posted by KUL KING (Guest)
on 2012-09-24 19:30
(Received via mailing list)
Have you checked that profile id is being passed in params[:id]?
Posted by jason baguio (jlbaguio)
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?
Posted by jason baguio (jlbaguio)
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?
Posted by Christopher R. Maden (Guest)
on 2012-09-25 23:07
(Received via mailing list)
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
No account? Register here.