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 via http://www.ruby-forum.com/.
-- 
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
Have you checked that profile id is being passed in params[:id]? On Mon, Sep 24, 2012 at 10:18 PM, jason baguio <lists-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> 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'') > > 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 via http://www.ruby-forum.com/. > > -- > You received this message because you are subscribed to the Google Groups > "Ruby on Rails: Talk" group. > To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > To unsubscribe from this group, send email to > rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > For more options, visit https://groups.google.com/groups/opt_out. > > >-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.
KUL KING wrote in post #1077336:> Have you checked that profile id is being passed in params[:id]?How ought I check this? -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/groups/opt_out.
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 via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/groups/opt_out.
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 -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/groups/opt_out.