# lib/generators/rails/policy/policy_generator.rb
module Rails
module Generators
class PolicyGenerator < NamedBase
source_root File . expand_path ( 'templates' , __dir__ )
def copy_policy_file
template 'policy.erb' , File . join ( "app/policies" , class_path , "#{ file_name } _policy.rb" )
end
hook_for :test_framework
end
end
end
# lib/generators/rails/policy/templates/policy.erb
class <%= class_name %>Policy
# Add default methods
end
A hook to invoke the custom generator with scaffolding or with controller's generators
# lib/generators/rails/policy/hooks.rb
require 'rails/generators'
require 'rails/generators/rails/scaffold/scaffold_generator'
require 'rails/generators/rails/controller/controller_generator'
Rails ::Generators ::ScaffoldGenerator . hook_for :policy , default : true , type : :boolean # invoke with scaffolding generators
Rails ::Generators ::ControllerGenerator . hook_for :policy , default : true , type : :boolean # invoke with the controllers' generator.
The generator of a spec file
# lib/generators/rspec/policy/policy_generator.rb
module Rspec
module Generators
class PolicyGenerator < Rails ::Generators ::NamedBase
source_root File . expand_path ( 'templates' , __dir__ )
def copy_policy_spec_file
template 'policy_spec.erb' , File . join ( "spec/policies" , class_path , "#{ file_name } _policy_spec.rb" )
end
end
end
end
# lib/generators/rspec/policy/templates/policy_spec.erb
require 'spec_helper'
describe <%= class_name %>Policy do
pending "add some examples to (or delete) #{ __FILE__ } "
end
Application config to hook up custom generators
# config/application.rb
module YourAppName
class Application < Rails ::Application
# ...
config . generators do |g |
g . test_framework :rspec
require './lib/generators/rails/policy/hooks'
end
end
end
$ rails g scaffold user
invoke resource_route
route resources :users
invoke scaffold_controller
create app/controllers/users_controller.rb
invoke erb
create app/views/users
create app/views/users/index.html.erb
create app/views/users/edit.html.erb
create app/views/users/show.html.erb
create app/views/users/new.html.erb
create app/views/users/_form.html.erb
invoke rspec
create spec/requests/users_spec.rb
create spec/views/users/edit.html.erb_spec.rb
create spec/views/users/index.html.erb_spec.rb
create spec/views/users/new.html.erb_spec.rb
create spec/views/users/show.html.erb_spec.rb
create spec/routing/users_routing_spec.rb
invoke helper
create app/helpers/users_helper.rb
invoke rspec
create spec/helpers/users_helper_spec.rb
invoke jbuilder
create app/views/users/index.json.jbuilder
create app/views/users/show.json.jbuilder
create app/views/users/_user.json.jbuilder
invoke assets
invoke scss
create app/assets/stylesheets/users.scss
invoke css
identical app/assets/stylesheets/scaffold.css
invoke policy
create app/policies/user_policy.rb
invoke rspec
create spec/policies/user_policy_spec.rb
$ cat app/policies/user_policy.rb
class UserPolicy
# Add default methods
end
$ cat spec/policies/user_policy_spec.rb
require ' spec_helper'
describe UserPolicy do
pending " add some examples to (or delete) #{__FILE__}"
end
Generate a controller inside a module
$ rails g controller api/project
create app/controllers/api/project_controller.rb
invoke erb
create app/views/api/project
invoke helper
create app/helpers/api/project_helper.rb
invoke rspec
create spec/helpers/api/project_helper_spec.rb
invoke assets
invoke scss
create app/assets/stylesheets/api/project.scss
invoke policy
create app/policies/api/project_policy.rb
invoke rspec
create spec/policies/api/project_policy_spec.rb
$ cat app/policies/api/project_policy.rb
class Api::ProjectPolicy
# Add default methods
end
$ cat spec/policies/api/project_policy_spec.rb
require ' spec_helper'
describe Api::ProjectPolicy do
pending " add some examples to (or delete) #{__FILE__}"
end
@james-em I'm not too sure that your controller scaffold templates are supposed to end with
.tt
🤔Have you tried simply ending them with
.rb
and seeing whether rails picks them up?