# 20170910010823_create_contacts.rb # rails g model contact user_id:integer type first_name last_name phone_number address city state zip birthday class CreateContacts < ActiveRecord::Migration[5.1] def change create_table :contacts do |t| t.integer :user_id t.string :type t.string :first_name t.string :last_name t.string :phone_number t.string :address t.string :city t.string :state t.string :zip t.date :birthday t.timestamps end add_index :contacts, [:type, :user_id] end end





# contact.rb class Contact < ApplicationRecord scope :friends, -> { where(type: 'Friend') } scope :emergencies, -> { where(type: 'Emergency') } end





# emergency.rb class Emergency < Contact belongs_to :user validates :first_name, presence: true validates :last_name, presence: true validates :phone_number, presence: true end





# friend.rb class Friend < Contact belongs_to :user validates :first_name, presence: true validates :last_name, presence: true validates :birthday, presence: true end





# user.rb class User < ApplicationRecord has_many :emergencies, class_name: 'Emergency' has_many :friends, class_name: 'Friend' end





# routes.rb Rails.application.routes.draw do resources :users do resources :emergencies, controller: :contacts, type: 'Emergency' resources :friends, controller: :contacts, type: 'Friend' end root to: 'users#index' end





# show.html.erb <h1>Emergency Contacts</h1>

<%= link_to 'New', new_user_emergency_path(@user) %> <table class='table'> <thead> <tr> <th></th> <th>First Name</th> <th>Last Name</th> <th>Phone Number</th> <th>Birthday</th> </tr> </thead> <tbody> <% @user.emergencies.each do |contact| %> <tr> <td><%= link_to 'delete', [@user, contact], method: :delete %></td> <td><%= contact.first_name %></td> <td><%= contact.last_name %></td> <td><%= contact.phone_number %></td> <td><%= contact.birthday %></td> </tr> <% end %> </tbody> </table> <h1>Friends Contacts</h1> <%= link_to 'New', new_user_friend_path(@user) %> <table class='table'> <thead> <tr> <th></th> <th>First Name</th> <th>Last Name</th> <th>Phone Number</th> <th>Birthday</th> </tr> </thead> <tbody> <% @user.friends.each do |contact| %> <tr> <td><%= link_to 'delete', [@user, contact], method: :delete %></td> <td><%= contact.first_name %></td> <td><%= contact.last_name %></td> <td><%= contact.phone_number %></td> <td><%= contact.birthday %></td> </tr> <% end %> </tbody> </table>





_form.html.erb <%= form_with model: [@user, contact], local: contact do |form| %> ... <% end %>





# contacts_controller.rb class ContactsController < ApplicationController before_action :set_contact, only: [:show, :edit, :update, :destroy] def new @user = User.find(params[:user_id]) @contact = @user.send(set_type.pluralize).new end def edit end def create @user = User.find(params[:user_id]) @contact = @user.send(set_type.pluralize).new(contact_params) if @contact.save redirect_to @user, notice: "#{params[:type]} Contact was successfully created." else render :new end end def update if @contact.update(contact_params) redirect_to @user, notice: "#{params[:type]} Contact was successfully updated." else render :edit end end def destroy @contact.destroy redirect_to @user, notice: "#{params[:type]} was successfully destroyed." end private def set_contact @user = User.find(params[:user_id]) @contact = @user.send(set_type.pluralize).find(params[:id]) end def set_type case params[:type] when 'Friend' 'friend' when 'Emergency' 'emergency' end end def contact_params params.require(set_type.to_sym).permit(:type, :first_name, :last_name, :phone_number, :address, :city, :state, :zip, :birthday) end end