# 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
# 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.
# 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
# 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
$ 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
@annikoff
There's an issue with this approach. I am currently using this to generate policy files.
This for some reason is not creating model. It is skipping the model generator.
Did you face the same issue and did you add any workaround for the same?