Make ERB generators more flexible and customizable.

This commit is contained in:
José Valim 2010-03-21 19:30:42 +01:00
parent 87db863fa2
commit 8b50f89ba7
5 changed files with 38 additions and 46 deletions

View File

@ -3,6 +3,19 @@ require 'rails/generators/named_base'
module Erb
module Generators
class Base < Rails::Generators::NamedBase #:nodoc:
protected
def format
:html
end
def handler
:erb
end
def filename_with_extensions(name)
[name, format, handler].compact.join(".")
end
end
end
end

View File

@ -5,15 +5,13 @@ module Erb
class ControllerGenerator < Base
argument :actions, :type => :array, :default => [], :banner => "action action"
def create_view_files
def copy_view_files
base_path = File.join("app/views", class_path, file_name)
empty_directory base_path
actions.each do |action|
@action = action
@path = File.join(base_path, "#{action}.html.erb")
template 'view.html.erb', @path
@action, @path = action, File.join(base_path, action)
template filename_with_extensions(:view), filename_with_extensions(@path)
end
end
end

View File

@ -1,19 +1,12 @@
require 'generators/erb'
require 'generators/erb/controller/controller_generator'
module Erb
module Generators
class MailerGenerator < Base
argument :actions, :type => :array, :default => [], :banner => "method method"
class MailerGenerator < ControllerGenerator
protected
def create_view_folder
empty_directory File.join("app/views", file_path)
end
def create_view_files
actions.each do |action|
@action, @path = action, File.join(file_path, action)
template "view.text.erb", File.join("app/views", "#{@path}.text.erb")
end
def format
:text
end
end
end

View File

@ -15,39 +15,27 @@ module Erb
empty_directory File.join("app/views", controller_file_path)
end
def copy_index_file
return if options[:singleton]
copy_view :index
end
def copy_view_files
views = available_views
views.delete("index") if options[:singleton]
def copy_edit_file
copy_view :edit
end
def copy_show_file
copy_view :show
end
def copy_new_file
copy_view :new
end
def copy_form_file
copy_view :_form
views.each do |view|
filename = filename_with_extensions(view)
template filename, File.join("app/views", controller_file_path, filename)
end
end
def copy_layout_file
return unless options[:layout]
template "layout.html.erb",
File.join("app/views/layouts", controller_class_path, "#{controller_file_name}.html.erb")
template filename_with_extensions(:layout),
File.join("app/views/layouts", controller_class_path, filename_with_extensions(controller_file_name))
end
protected
def copy_view(view)
template "#{view}.html.erb", File.join("app/views", controller_file_path, "#{view}.html.erb")
end
protected
def available_views
%w(index edit show new _form)
end
end
end
end

View File

@ -29,19 +29,19 @@ class MailerGeneratorTest < Rails::Generators::TestCase
def test_invokes_default_test_framework
run_generator
assert_file "test/functional/notifier_test.rb", /class NotifierTest < ActionMailer::TestCase/
assert_file "test/fixtures/notifier/foo", /app\/views\/notifier\/foo/
assert_file "test/fixtures/notifier/bar", /app\/views\/notifier\/bar/
assert_file "test/fixtures/notifier/foo", /app\/views\/notifier\/foo$/
assert_file "test/fixtures/notifier/bar", /app\/views\/notifier\/bar$/
end
def test_invokes_default_template_engine
run_generator
assert_file "app/views/notifier/foo.text.erb" do |view|
assert_match /app\/views\/notifier\/foo/, view
assert_match /app\/views\/notifier\/foo$/, view
assert_match /<%= @greeting %>/, view
end
assert_file "app/views/notifier/bar.text.erb" do |view|
assert_match /app\/views\/notifier\/bar/, view
assert_match /app\/views\/notifier\/bar$/, view
assert_match /<%= @greeting %>/, view
end
end