require 'rails/generators/migration' class Spud::ModuleGenerator < ::Rails::Generators::Base desc "Creates a new model, dashboard module, and frontend route" argument :module_name, :type => :string argument :attributes, :type => :array, :default => [], :banner => "field[:type][:index] field[:type][:index]" source_root File.expand_path('../templates', __FILE__) def create_module template "admin_controller.rb.erb", "app/controllers/admin/#{module_name_formatted}_controller.rb" template "controller.rb.erb", "app/controllers/#{module_name_formatted}_controller.rb" template "assets/module.js.erb", "app/assets/javascripts/#{module_name_formatted}.js" template "assets/admin/module.js.erb", "app/assets/javascripts/admin/#{module_name_formatted}.js" create_file "app/assets/stylesheets/admin/#{module_name_formatted}.scss", "// Place #{module_name} admin styles here\n\n" create_file "app/assets/stylesheets/#{module_name_formatted}.scss", "// Place #{module_name} styles here\n\n" template "views/admin/index.html.erb", "app/views/admin/#{module_name_formatted}/index.html.erb" template "views/admin/show.html.erb", "app/views/admin/#{module_name_formatted}/show.html.erb" template "views/admin/new.html.erb", "app/views/admin/#{module_name_formatted}/new.html.erb" template "views/admin/edit.html.erb", "app/views/admin/#{module_name_formatted}/edit.html.erb" template "views/admin/_form.html.erb", "app/views/admin/#{module_name_formatted}/_form.html.erb" template "views/frontend/index.html.erb", "app/views/#{module_name_formatted}/index.html.erb" template "views/frontend/show.html.erb", "app/views/#{module_name_formatted}/show.html.erb" environment("Spud::Core.config.admin_applications += [{:name => '#{module_name_formatted.humanize.titlecase}', :thumbnail => \"admin/module_icon.png\", :url => \"/admin/#{module_name_formatted}\"}]") create_routes Rails::Generators.invoke "model", [module_name_formatted.singularize] + attributes, :behavior => behavior Rails::Generators.invoke 'helper', [module_name], :behavior => behavior Rails::Generators.invoke 'helper', ["Admin/#{module_name}"], :behavior => behavior if self.behavior == :invoke create_model_scopes() end end private def module_name_formatted module_name.pluralize.underscore end def create_routes route < [:index, :show] EOF end def field_for_attribute(type, name) case type when 'integer' "<%= f.tb_number_field :#{name} %>" when 'text' "<%= f.tb_text_area :#{name}, :rows => 4 %>" when 'boolean' "<%= f.tb_check_box :#{name} %>" when 'date' "<%= f.tb_date_select :#{name} %>" else "<%= f.tb_text_field :#{name} %>" end end def application_name Rails.application.class.name.split('::').first.underscore end def attribute_names attributes.collect{ |att| att.split(':')[0] } end def create_model_scopes sort_field = ask("What field would you like to sort by?", :default => 'created_at') search_field = ask("What field would you like to search by?", :default => attributes.first.split(':').first) inject_into_file "app/models/#{module_name.singularize.underscore}.rb", after: "ActiveRecord::Base\n" do <<-RUBY scope :ordered, ->{ order('#{sort_field} desc') } scope :search, ->(term){ where('#{search_field} LIKE ?', "%\#{term}%") } RUBY end end end