# Terminal
rails plugin new books_module --mountable
# test/dummy/config/routes.rb
Rails.application.routes.draw do
resources :users
mount BooksModule::Engine => "/books_module", as: :books_engine
root to: 'users#index'
end
# Terminal
cd test/dummy
rails g scaffold users first_name last_name
rake db:migrate
cd ../..
rails g scaffold books name year:date
rake db:migrate
rails g migration add_book_id_to_users book_id:integer:index
rake db:migrate
rake books_module:install:migrations
# test/dummy/app/views/users/index.html.erb
<%= link_to 'Books', books_engine.books_path %>
# app/views/books/index.html
<%= link_to 'Users', main_app.users_path %>
# lib/books_module.rb
require "books_module/engine"
module BooksModule
require_relative 'books_module/model.rb'
end
# lib/books_module/model.rb
require_relative 'models/user.rb'
# lib/books_module/models/user.rb
module BooksModule
module UserModel
extend ActiveSupport::Concern
included do
belongs_to :book, class_name: 'BooksModule::Book', optional: true
def has_favorite_book?
book.present?
end
end
end
end
# lib/test/dummy/app/models/user.rb
class User < ApplicationRecord
# belongs_to :book, class_name: 'BooksModule::Book', optional: true
# def has_favorite_book?
# book.present?
# end
include BooksModule::UserModel
end
# app/models/books_module/book.rb
module BooksModule
class Book < ApplicationRecord
has_many :users
end
end
# test/dummy/app/views/users/_form.html.erb
<%= form.label :book_id %>
<%= form.collection_select :book_id, BooksModule::Book.all, :id, :name, include_blank: true %>
# test/dummy/app/controllers/uesrs_controller.rb
private
...
def user_params
params.require(:user).permit(:first_name, :last_name, :book_id)
end