# Terminal
rails g scaffold company name website
rails g scaffold employees first_name last_name email birth_date:date
rails g model note notable:references{polymorphic} content:text
# database migrations
class CreateNotes < ActiveRecord::Migration[5.1]
def change
create_table :notes do |t|
t.references :notable, polymorphic: true
t.text :content
t.timestamps
end
end
end
create_table "notes", force: :cascade do |t|
t.string "notable_type"
t.integer "notable_id"
t.text "content"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["notable_type", "notable_id"], name: "index_notes_on_notable_type_and_notable_id"
end
# note.rb
class Note < ApplicationRecord
belongs_to :notable, polymorphic: true
end
# employee.rb
class Employee < ApplicationRecord
has_many :notes, as: :notable
end
# company.rb
class Company < ApplicationRecord
has_many :notes, as: :notable
end
# routes.rb
Rails.application.routes.draw do
resources :companies do
resources :notes, module: :companies
end
resources :employees do
resources :notes, module: :employees
end
...
end
# notes_controller.rb
class NotesController < ApplicationController
def new
@note = @notable.notes.new
end
def create
@note = @notable.notes.new note_params
@notable.save
redirect_to @notable, notice: "Your note was successfully posted."
end
private
def note_params
params.require(:note).permit(:content)
end
end
# employees/notes_controller.rb
class Employees::NotesController < NotesController
before_action :set_notable
private
def set_notable
@notable = Employee.find(params[:employee_id])
end
end
# companies/notes_controller.rb
class Companies::NotesController < NotesController
before_action :set_notable
def create
# NOTIFY
super
end
private
def set_notable
@notable = Company.find(params[:company_id])
end
end
# employees/show.html.erb
<%= render partial: "notes/notes", locals: {notable: @employee} %>
<%= render partial: "notes/form", locals: {notable: @employee} %>
# companies/show.html.erb
<%= render partial: "notes/notes", locals: {notable: @company} %>
<%= render partial: "notes/form", locals: {notable: @company} %>
# notes/_form.html.erb
<%= form_with(model: [notable, Note.new], local: true) do |form| %>
<div class="field">
<%= form.label :content %><br/>
<%= form.text_area :content %>
</div>
<%= form.submit class: "btn btn-primary" %>
<% end %>
# notes/_notes.html.erb
<h3>Notes</h3>
<% notable.notes.each do |note| %>
<p>
<hr>
<%= note.content %>
<em><%= time_ago_in_words note.created_at %></em>
</p>
<% end %>