HAS_ONE ASSOCIATION WITH DEVISE USER

Quick scenario for the project: you’re trying to create a rails application with users that have a portfolio (for others, it’ll be profile or account page). 

Assumption/Steps: 

  • Your rails application has a home index page and is your root page. {Route.rb => root to: “home#index”}
  • You have generated devise User
  • You have added extra fields to user forms. For my project I added a name and about field. My application_controller.rb:
 class ApplicationController < ActionController::Base
  before_filter :configure_permitted_parameters, if: :devise_controller?
  protect_from_forgery with: :exception
  
  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :about])
	devise_parameter_sanitizer.permit(:account_update, keys: [:name, :about])
  end
end

            The Github devise page gives a detailed tutorial on how to do that.

  • You have a portfolio  model, controller, . . .  (Yours may be profile or account).  For my project, I did: 
rails g scaffold portfolio head_line:string
user.rb => 
class User < ApplicationRecord
  has_one :portfolio, dependent: :destroy
  before_create :build_portfolio
  accepts_nested_attributes_for :portfolio		 
end

portfolio.rb =>
class Portfolio < ApplicationRecord
  belongs_to :user
end 
rails g migration add_user_id_to_portfolios user_id:integer
  • Now start your rails server and create a new user. When you click the submit button, the user and portfolio page will be created and you should be redirected to your home page as the root page.
  • It would be safe to delete the index function in portfolio controller as well as the index.html.erb in your portfolio view. and to routes you’d want to change resources :portfolios  to  resources :portfolios, except: [:index] 
  • Now you’re in your home page and there’s no link to redirect to the portfolio page. Let’s fix that.
home_controller.rb =>
class HomeController < ApplicationController

  def index
	@portfolio = Portfolio.find(current_user.portfolio[:id])
  end
end 


/views/home/index.html.erb =>
<p><%= link_to "My Portfolio", "/portfolios/#{@portfolio.id}" %></p>

   refresh the page and try the link.

/views/portfolios/show.html.erb => 
<h3><%= @portfolio.user.name %>'s Portfolio</h3>
<p><strong>Portfolio Link: </strong>http://localhost:3000/portfolios/<%= @portfolio.id %></p>
</div>
<h4>name: <%= @portfolio.user.name %></h4>
<h4>About: <%= @portfolio.user.about %></h4>

. . . and that’s the end of the tutorial.