diff --git a/.gitignore b/.gitignore index 9fab38c6..0649969e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ test/tmp test/version_tmp tmp *.swp +.ruby-version diff --git a/lib/active_model/serializer/generators/serializer/scaffold_controller_generator.rb b/lib/active_model/serializer/generators/serializer/scaffold_controller_generator.rb new file mode 100644 index 00000000..2458658a --- /dev/null +++ b/lib/active_model/serializer/generators/serializer/scaffold_controller_generator.rb @@ -0,0 +1,12 @@ +require 'rails/generators' +require 'rails/generators/rails/scaffold_controller/scaffold_controller_generator' + +module Rails + module Generators + class ScaffoldControllerGenerator + source_root File.expand_path('../templates', __FILE__) + + hook_for :serializer, default: true + end + end +end diff --git a/lib/active_model/serializer/generators/serializer/templates/controller.rb b/lib/active_model/serializer/generators/serializer/templates/controller.rb new file mode 100644 index 00000000..3d68aaee --- /dev/null +++ b/lib/active_model/serializer/generators/serializer/templates/controller.rb @@ -0,0 +1,93 @@ +<% if namespaced? -%> +require_dependency "<%= namespaced_file_path %>/application_controller" + +<% end -%> +<% module_namespacing do -%> +class <%= controller_class_name %>Controller < ApplicationController + before_action :set_<%= singular_table_name %>, only: [:show, :edit, :update, :destroy] + + # GET <%= route_url %> + # GET <%= route_url %>.json + def index + @<%= plural_table_name %> = <%= orm_class.all(class_name) %> + + respond_to do |format| + format.html # index.html.erb + format.json { render json: <%= "@#{plural_table_name}" %> } + end + end + + # GET <%= route_url %>/1 + # GET <%= route_url %>/1.json + def show + respond_to do |format| + format.html # show.html.erb + format.json { render json: <%= "@#{singular_table_name}" %> } + end + end + + # GET <%= route_url %>/new + def new + @<%= singular_table_name %> = <%= orm_class.build(class_name) %> + end + + # GET <%= route_url %>/1/edit + def edit + end + + # POST <%= route_url %> + # POST <%= route_url %>.json + def create + @<%= singular_table_name %> = <%= orm_class.build(class_name, "#{singular_table_name}_params") %> + + respond_to do |format| + if @<%= orm_instance.save %> + format.html { redirect_to @<%= singular_table_name %>, notice: <%= "'#{human_name} was successfully created.'" %> } + format.json { render json: <%= "@#{singular_table_name}" %>, status: :created } + else + format.html { render action: 'new' } + format.json { render json: <%= "@#{orm_instance.errors}" %>, status: :unprocessable_entity } + end + end + end + + # PATCH/PUT <%= route_url %>/1 + # PATCH/PUT <%= route_url %>/1.json + def update + respond_to do |format| + if @<%= orm_instance.update("#{singular_table_name}_params") %> + format.html { redirect_to @<%= singular_table_name %>, notice: <%= "'#{human_name} was successfully updated.'" %> } + format.json { head :no_content } + else + format.html { render action: 'edit' } + format.json { render json: <%= "@#{orm_instance.errors}" %>, status: :unprocessable_entity } + end + end + end + + # DELETE <%= route_url %>/1 + # DELETE <%= route_url %>/1.json + def destroy + @<%= orm_instance.destroy %> + respond_to do |format| + format.html { redirect_to <%= index_helper %>_url } + format.json { head :no_content } + end + end + + private + # Use callbacks to share common setup or constraints between actions. + def set_<%= singular_table_name %> + @<%= singular_table_name %> = <%= orm_class.find(class_name, "params[:id]") %> + end + + # Never trust parameters from the scary internet, only allow the white list through. + def <%= "#{singular_table_name}_params" %> + <%- if attributes_names.empty? -%> + params[<%= ":#{singular_table_name}" %>] + <%- else -%> + params.require(<%= ":#{singular_table_name}" %>).permit(<%= attributes_names.map { |name| ":#{name}" }.join(', ') %>) + <%- end -%> + end +end +<% end -%> diff --git a/lib/active_model/serializer/railtie.rb b/lib/active_model/serializer/railtie.rb index 080fc53a..c3d61372 100644 --- a/lib/active_model/serializer/railtie.rb +++ b/lib/active_model/serializer/railtie.rb @@ -3,6 +3,7 @@ module ActiveModel initializer 'generators' do |app| require 'rails/generators' require 'active_model/serializer/generators/serializer/serializer_generator' + require 'active_model/serializer/generators/serializer/scaffold_controller_generator' Rails::Generators.configure!(app.config.generators) require 'active_model/serializer/generators/resource_override' end diff --git a/test/integration/generators/scaffold_controller_generator_test.rb b/test/integration/generators/scaffold_controller_generator_test.rb new file mode 100644 index 00000000..fbe3d5e2 --- /dev/null +++ b/test/integration/generators/scaffold_controller_generator_test.rb @@ -0,0 +1,65 @@ +require 'test_helper' +require 'rails' +require 'test_app' +require 'active_model/serializer/generators/serializer/scaffold_controller_generator' + +class ScaffoldControllerGeneratorTest < Rails::Generators::TestCase + destination File.expand_path('../../../tmp', __FILE__) + setup :prepare_destination + + tests Rails::Generators::ScaffoldControllerGenerator + arguments %w(account name:string description:text business:references) + + def test_generated_controller + run_generator + + assert_file 'app/controllers/accounts_controller.rb' do |content| + + assert_instance_method :index, content do |m| + assert_match /@accounts = Account\.all/, m + assert_match /format.html/, m + assert_match /format.json \{ render json: @accounts \}/, m + end + + assert_instance_method :show, content do |m| + assert_match /format.html/, m + assert_match /format.json \{ render json: @account \}/, m + end + + assert_instance_method :new, content do |m| + assert_match /@account = Account\.new/, m + end + + assert_instance_method :edit, content do |m| + assert m.blank? + end + + assert_instance_method :create, content do |m| + assert_match /@account = Account\.new\(account_params\)/, m + assert_match /@account\.save/, m + assert_match /format\.html \{ redirect_to @account, notice: 'Account was successfully created\.' \}/, m + assert_match /format\.json \{ render json: @account, status: :created \}/, m + assert_match /format\.html \{ render action: 'new' \}/, m + assert_match /format\.json \{ render json: @account\.errors, status: :unprocessable_entity \}/, m + end + + assert_instance_method :update, content do |m| + assert_match /format\.html \{ redirect_to @account, notice: 'Account was successfully updated\.' \}/, m + assert_match /format\.json \{ head :no_content \}/, m + assert_match /format\.html \{ render action: 'edit' \}/, m + assert_match /format\.json \{ render json: @account.errors, status: :unprocessable_entity \}/, m + end + + assert_instance_method :destroy, content do |m| + assert_match /@account\.destroy/, m + assert_match /format\.html { redirect_to accounts_url \}/, m + assert_match /format\.json \{ head :no_content \}/, m + end + + assert_match(/def account_params/, content) + assert_match(/params\.require\(:account\)\.permit\(:name, :description, :business_id\)/, content) + + end + + end +end