merb_activerecord 0.5 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. data/LICENSE +1 -1
  2. data/Rakefile +11 -6
  3. data/activerecord_generators/database_sessions_migration/database_sessions_migration_generator.rb +4 -2
  4. data/activerecord_generators/migration/migration_generator.rb +37 -9
  5. data/activerecord_generators/migration/templates/schema/migrations/%migration_file_name%.rb +17 -0
  6. data/activerecord_generators/model/model_generator.rb +36 -11
  7. data/activerecord_generators/model/templates/app/models/%model_file_name%.rb +2 -0
  8. data/activerecord_generators/resource_controller/resource_controller_generator.rb +65 -17
  9. data/activerecord_generators/resource_controller/templates/app/controllers/%controller_file_name%.rb +68 -0
  10. data/activerecord_generators/resource_controller/templates/app/helpers/%controller_file_name%_helper.rb +16 -0
  11. data/activerecord_generators/resource_controller/templates/app/views/%controller_file_name%/edit.html.erb +3 -0
  12. data/activerecord_generators/resource_controller/templates/app/views/%controller_file_name%/index.html.erb +3 -0
  13. data/activerecord_generators/resource_controller/templates/app/views/%controller_file_name%/new.html.erb +3 -0
  14. data/activerecord_generators/resource_controller/templates/app/views/%controller_file_name%/show.html.erb +3 -0
  15. data/lib/{merb/orms/active_record/tasks/databases.rb → active_record/merbtasks.rb} +131 -64
  16. data/lib/merb/orms/active_record/connection.rb +39 -16
  17. data/lib/merb/orms/active_record/{database.sample.yml → database.yml.sample} +1 -0
  18. data/lib/merb/session/active_record_session.rb +9 -3
  19. data/lib/merb_activerecord.rb +16 -10
  20. metadata +77 -61
  21. data/activerecord_generators/migration/templates/new_migration.erb +0 -15
  22. data/activerecord_generators/model/templates/new_model.erb +0 -2
  23. data/activerecord_generators/resource_controller/templates/controller.rb +0 -54
  24. data/activerecord_generators/resource_controller/templates/edit.html.erb +0 -1
  25. data/activerecord_generators/resource_controller/templates/helper.rb +0 -5
  26. data/activerecord_generators/resource_controller/templates/index.html.erb +0 -1
  27. data/activerecord_generators/resource_controller/templates/new.html.erb +0 -1
  28. data/activerecord_generators/resource_controller/templates/show.html.erb +0 -1
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2007 YOUR NAME
1
+ Copyright (c) 2007 Duane Johnson
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -3,7 +3,7 @@ require 'rake/gempackagetask'
3
3
 
4
4
  PLUGIN = "merb_activerecord"
5
5
  NAME = "merb_activerecord"
6
- VERSION = "0.5"
6
+ VERSION = "0.9.2"
7
7
  AUTHOR = "Duane Johnson"
8
8
  EMAIL = "canadaduane@gmail.com"
9
9
  HOMEPAGE = "http://merbivore.com"
@@ -20,21 +20,26 @@ spec = Gem::Specification.new do |s|
20
20
  s.author = AUTHOR
21
21
  s.email = EMAIL
22
22
  s.homepage = HOMEPAGE
23
- s.add_dependency('merb', '>= 0.5')
24
- s.require_path = 'lib'
23
+ s.add_dependency("merb-core", ">= 0.9.2")
24
+ s.require_path = "lib"
25
25
  s.autorequire = PLUGIN
26
26
  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{lib,specs,activerecord_generators}/**/*")
27
27
  end
28
28
 
29
+ windows = (PLATFORM =~ /win32|cygwin/) rescue nil
30
+
31
+ SUDO = windows ? "" : "sudo"
32
+
29
33
  Rake::GemPackageTask.new(spec) do |pkg|
30
34
  pkg.gem_spec = spec
31
35
  end
32
36
 
33
- task :install do
34
- sh %{rake package}
35
- sh %{sudo gem install pkg/#{NAME}-#{VERSION}}
37
+ desc "Install merb_activerecord"
38
+ task :install => :package do
39
+ sh %{#{SUDO} gem install pkg/#{NAME}-#{VERSION} --no-rdoc --no-ri --no-update-sources}
36
40
  end
37
41
 
42
+ desc "Release the current version on rubyforge"
38
43
  task :release => :package do
39
44
  sh %{rubyforge add_release merb #{PLUGIN} #{VERSION} pkg/#{NAME}-#{VERSION}.gem}
40
45
  end
@@ -1,9 +1,11 @@
1
- require 'merb'
2
- class DatabaseSessionsMigrationGenerator < RubiGen::Base
1
+ class DatabaseSessionsMigrationGenerator < Merb::GeneratorBase
3
2
 
4
3
  default_options :author => nil
5
4
 
6
5
  def initialize(runtime_args, runtime_options = {})
6
+ # put somthing into the runtime_args so that super doesn't show the
7
+ # description
8
+ runtime_args.push ""
7
9
  super
8
10
  @name = 'database_sessions'
9
11
  end
@@ -1,14 +1,42 @@
1
- require 'merb/generators/merb_generator_helpers'
2
-
3
- class MigrationGenerator < Merb::GeneratorHelpers::MigrationGeneratorBase
1
+ class MigrationGenerator < Merb::GeneratorBase
2
+ attr_reader :model_attributes, :model_class_name, :model_file_name, :table_name
4
3
 
5
- def initialize( *args )
6
- super( *args )
7
- @migration_template_name = "new_migration.erb"
4
+ def initialize(args, runtime_args = {})
5
+ @base = File.dirname(__FILE__)
6
+ super
7
+ @model_file_name = args.shift.snake_case
8
+ @table_name = @model_file_name.pluralize
9
+ @model_class_name = @model_file_name.to_const_string
10
+ @model_attributes = Hash[*(args.map{|a| a.split(":") }.flatten)]
8
11
  end
9
12
 
10
- def self.superclass
11
- RubiGen::Base
12
- end
13
+ def manifest
14
+ record do |m|
15
+ @m = m
16
+
17
+ m.directory "schema/migrations"
18
+
19
+ current_migration_number = Dir[Dir.pwd+'/schema/migrations/*'].map{|f| File.basename(f) =~ /^(\d+)/; $1}.max
20
+ @migration_file_name = format("%03d_%s", (current_migration_number.to_i+1), model_file_name) + "_migration"
13
21
 
22
+ @assigns = { :model_file_name => model_file_name,
23
+ :model_attributes => model_attributes,
24
+ :model_class_name => model_class_name,
25
+ :table_name => table_name,
26
+ :migration_file_name => @migration_file_name
27
+ }
28
+ copy_dirs
29
+ copy_files
30
+ end
31
+ end
32
+
33
+ protected
34
+ def banner
35
+ <<-EOS.split("\n").map{|x| x.strip}.join("\n")
36
+ Creates an Active Record Migration stub..
37
+
38
+ USAGE: #{spec.name}"
39
+ EOS
40
+ end
41
+
14
42
  end
@@ -0,0 +1,17 @@
1
+ class <%= model_class_name %>Migration < ActiveRecord::Migration
2
+ def self.up
3
+ <%= "create_table :#{table_name} do |t|" if table_name %>
4
+ <% for attribute in model_attributes -%>
5
+ t.<%= "%-11s" % attribute.last %> :<%= attribute.first %>
6
+ <% end -%>
7
+
8
+ t.timestamps
9
+ <%= "end" if table_name %>
10
+ end
11
+
12
+ def self.down
13
+ <% if table_name -%>
14
+ drop_table :<%= table_name %>
15
+ <% end -%>
16
+ end
17
+ end
@@ -1,16 +1,41 @@
1
- require 'merb/generators/merb_generator_helpers'
2
-
3
- class ModelGenerator < Merb::GeneratorHelpers::ModelGeneratorBase
1
+ class ModelGenerator < Merb::GeneratorBase
2
+ attr_reader :model_attributes, :model_class_name, :model_file_name, :migration_args
4
3
 
5
- def initialize( *args )
6
- super( *args )
7
- @model_template_name = "new_model.erb"
8
- @migration_generator_name = "migration"
9
- @model_test_generator_name = "merb_model_test"
4
+ def initialize(args, runtime_args = {})
5
+ @base = File.dirname(__FILE__)
6
+ @migration_args = args.dup
7
+ super
8
+ @model_file_name = args.shift.snake_case
9
+ @model_class_name = @model_file_name.to_const_string
10
+ @model_attributes = Hash[*(args.map{|a| a.split(":") }.flatten)]
11
+ @model_file_name = "#{@model_class_name.snake_case}"
12
+
13
+
10
14
  end
11
15
 
12
- def self.superclass
13
- RubiGen::Base
14
- end
16
+ def manifest
17
+ record do |m|
18
+ @m = m
15
19
 
20
+ @assigns = { :model_file_name => model_file_name,
21
+ :model_attributes => model_attributes,
22
+ :model_class_name => model_class_name
23
+ }
24
+ copy_dirs
25
+ copy_files
26
+
27
+ m.dependency "migration", [*self.migration_args]
28
+ m.dependency "merb_model_test", [model_file_name], @assigns
29
+ end
30
+ end
31
+
32
+ protected
33
+ def banner
34
+ <<-EOS.split("\n").map{|x| x.strip}.join("\n")
35
+ Creates an Active Record Model stub..
36
+
37
+ USAGE: #{spec.name}"
38
+ EOS
39
+ end
40
+
16
41
  end
@@ -0,0 +1,2 @@
1
+ class <%= model_class_name %> < ActiveRecord::Base
2
+ end
@@ -1,26 +1,74 @@
1
- require 'merb/generators/merb_generator_helpers'
2
-
3
- class ResourceControllerGenerator < Merb::GeneratorHelpers::ControllerGeneratorBase
1
+ class ResourceControllerGenerator < Merb::GeneratorBase
2
+
3
+ attr_reader :controller_class_name,
4
+ :controller_file_name,
5
+ :controller_base_path,
6
+ :controller_modules,
7
+ :model_class_name,
8
+ :full_controller_const,
9
+ :singular_model,
10
+ :plural_model
11
+
12
+ def initialize(args, runtime_args = {})
13
+ @base = File.dirname(__FILE__)
14
+
15
+ super
16
+ name = args.shift
17
+ nfp = name.snake_case.gsub("::", "/")
18
+ nfp = nfp.split("/")
19
+ @model_class_name = nfp.pop.singularize.to_const_string
20
+ @model_class_name = runtime_args[:model_class_name] if runtime_args[:model_class_name]
21
+ @singular_model = @model_class_name.snake_case
22
+ @plural_model = @singular_model.pluralize
23
+
24
+ nfp << @plural_model
25
+
26
+ @controller_file_name = nfp.join("/")
27
+
28
+ # Need to setup the directories
29
+ unless @controller_file_name == File.basename(@controller_file_name)
30
+ @controller_base_path = controller_file_name.split("/")[0..-2].join("/")
31
+ end
32
+
33
+ @controller_modules = @controller_file_name.to_const_string.split("::")[0..-2]
34
+ @controller_class_name = @controller_file_name.to_const_string.split("::").last
4
35
 
5
- def initialize(*args)
6
- runtime_options = args.last.is_a?(Hash) ? args.pop : {}
7
- name, *actions = args.flatten
8
- runtime_options[:actions] = %w[index show new edit]
9
- runtime_options[:test_stub_generator] = "merb_controller_test"
10
- super( [name], runtime_options )
36
+ @full_controller_const = ((@controller_modules.dup || []) << @controller_class_name).join("::")
11
37
  end
12
-
13
- def self.superclass
14
- RubiGen::Base
38
+
39
+ def manifest
40
+ record do |m|
41
+ @m = m
42
+
43
+ # Create the controller directory
44
+ m.directory File.join("app/controllers", controller_base_path) if controller_base_path
45
+
46
+ # Create the helpers directory
47
+ m.directory File.join("app/helpers", controller_base_path) if controller_base_path
48
+
49
+ @assigns = {
50
+ :controller_modules => controller_modules,
51
+ :controller_class_name => controller_class_name,
52
+ :controller_file_name => controller_file_name,
53
+ :controller_base_path => controller_base_path,
54
+ :full_controller_const => full_controller_const,
55
+ :model_class_name => model_class_name,
56
+ :singular_model => singular_model,
57
+ :plural_model => plural_model
58
+ }
59
+ copy_dirs
60
+ copy_files
61
+
62
+ m.dependency "merb_resource_controller_test", [@controller_class_name], @assigns
63
+ end
15
64
  end
16
65
 
17
66
  protected
18
67
  def banner
19
- <<-EOS
20
- Creates a Merb controller, views and specs using Active Record Models
68
+ <<-EOS.split("\n").map{|x| x.strip}.join("\n")
69
+ Creates a basic Merb resource controller.
21
70
 
22
- USAGE: #{$0} #{spec.name} resource_name"
23
- EOS
71
+ USAGE: #{spec.name} my_resource
72
+ EOS
24
73
  end
25
-
26
74
  end
@@ -0,0 +1,68 @@
1
+ <% counter = 0 -%>
2
+ <% controller_modules.each_with_index do |mod, i| -%>
3
+ <%= " " * i %>module <%= mod %>
4
+ <% counter = i -%>
5
+ <% end -%>
6
+ <% counter = counter == 0 ? 0 : (counter + 1) -%>
7
+ <%= " " * counter %>class <%= controller_class_name %> < Application
8
+ <%= " " * counter %> # provides :xml, :yaml, :js
9
+
10
+ <%= " " * counter %> def index
11
+ <%= " " * counter %> @<%= plural_model %> = <%= model_class_name %>.find(:all)
12
+ <%= " " * counter %> display @<%= plural_model %>
13
+ <%= " " * counter %> end
14
+
15
+ <%= " " * counter %> def show
16
+ <%= " " * counter %> @<%= singular_model %> = <%= model_class_name %>.find_by_id(params[:id])
17
+ <%= " " * counter %> raise NotFound unless @<%= singular_model %>
18
+ <%= " " * counter %> display @<%= singular_model %>
19
+ <%= " " * counter %> end
20
+
21
+ <%= " " * counter %> def new
22
+ <%= " " * counter %> only_provides :html
23
+ <%= " " * counter %> @<%= singular_model %> = <%= model_class_name %>.new(params[:<%= singular_model %>])
24
+ <%= " " * counter %> render
25
+ <%= " " * counter %> end
26
+
27
+ <%= " " * counter %> def create
28
+ <%= " " * counter %> @<%= singular_model %> = <%= model_class_name %>.new(params[:<%= singular_model %>])
29
+ <%= " " * counter %> if @<%= singular_model %>.save
30
+ <%= " " * counter %> redirect url(:<%= (controller_modules.collect{|m| m.downcase} << singular_model).join("_") %>, @<%= singular_model %>)
31
+ <%= " " * counter %> else
32
+ <%= " " * counter %> render :new
33
+ <%= " " * counter %> end
34
+ <%= " " * counter %> end
35
+
36
+ <%= " " * counter %> def edit
37
+ <%= " " * counter %> only_provides :html
38
+ <%= " " * counter %> @<%= singular_model %> = <%= model_class_name %>.find_by_id(params[:id])
39
+ <%= " " * counter %> raise NotFound unless @<%= singular_model %>
40
+ <%= " " * counter %> render
41
+ <%= " " * counter %> end
42
+
43
+ <%= " " * counter %> def update
44
+ <%= " " * counter %> @<%= singular_model %> = <%= model_class_name %>.find_by_id(params[:id])
45
+ <%= " " * counter %> raise NotFound unless @<%= singular_model %>
46
+ <%= " " * counter %> if @<%= singular_model %>.update_attributes(params[:<%= singular_model %>])
47
+ <%= " " * counter %> redirect url(:<%= (controller_modules.collect{|m| m.downcase} << singular_model).join("_") %>, @<%= singular_model %>)
48
+ <%= " " * counter %> else
49
+ <%= " " * counter %> raise BadRequest
50
+ <%= " " * counter %> end
51
+ <%= " " * counter %> end
52
+
53
+ <%= " " * counter %> def destroy
54
+ <%= " " * counter %> @<%= singular_model %> = <%= model_class_name %>.find_by_id(params[:id])
55
+ <%= " " * counter %> raise NotFound unless @<%= singular_model %>
56
+ <%= " " * counter %> if @<%= singular_model %>.destroy
57
+ <%= " " * counter %> redirect url(:<%= (controller_modules.collect{|m| m.downcase} << singular_model).join("_") %>s)
58
+ <%= " " * counter %> else
59
+ <%= " " * counter %> raise BadRequest
60
+ <%= " " * counter %> end
61
+ <%= " " * counter %> end
62
+
63
+ <%= " " * counter %>end
64
+ <% counter = counter == 0 ? 0 : (counter - 1) -%>
65
+ <% controller_modules.reverse.each_with_index do |mod, i| -%>
66
+ <%= " " * counter %>end # <%= mod %>
67
+ <% counter = counter - 1 -%>
68
+ <% end -%>
@@ -0,0 +1,16 @@
1
+ <% counter = 1 -%>
2
+ module Merb
3
+ <% controller_modules.each_with_index do |mod, i| -%>
4
+ <%= " " * i %>module <%= mod %>
5
+ <% counter = i -%>
6
+ <% end -%>
7
+ <% counter = counter == 0 ? 0 : (counter + 1) -%>
8
+ <%= " " * counter %>module <%= controller_class_name %>Helper
9
+
10
+ <%= " " * counter %>end
11
+ <% counter = counter == 0 ? 0 : (counter - 1) -%>
12
+ <% controller_modules.reverse.each_with_index do |mod, i| -%>
13
+ <%= " " * counter %>end # <%= mod %>
14
+ <% counter = counter - 1 -%>
15
+ <% end -%>
16
+ end
@@ -0,0 +1,3 @@
1
+ <h1><%= full_controller_const %> controller, edit action</h1>
2
+
3
+ <p>Edit this file in <tt>app/views/<%= controller_file_name %>/edit.html.erb</tt></p>
@@ -0,0 +1,3 @@
1
+ <h1><%= full_controller_const %> controller, index action</h1>
2
+
3
+ <p>Edit this file in <tt>app/views/<%= controller_file_name %>/index.html.erb</tt></p>
@@ -0,0 +1,3 @@
1
+ <h1><%= full_controller_const %> controller, new action</h1>
2
+
3
+ <p>Edit this file in <tt>app/views/<%= controller_file_name %>/new.html.erb</tt></p>
@@ -0,0 +1,3 @@
1
+ <h1><%= full_controller_const %> controller, show action</h1>
2
+
3
+ <p>Edit this file in <tt>app/views/<%= controller_file_name %>/show.html.erb</tt></p>
@@ -1,20 +1,21 @@
1
- task :environment do
2
- Merb.environment = ( ENV['Merb.environment'] || Merb.environment ).to_sym
3
- end
4
-
5
1
  namespace :db do
2
+
3
+ task :merb_start do
4
+ Merb.start :adapter => 'runner', :environment => ENV['MERB_ENV'] || 'development', :log_file => Merb::Config[:log_file]
5
+ end
6
+
6
7
  namespace :create do
7
8
  desc 'Create all the local databases defined in config/database.yml'
8
- task :all => :environment do
9
- ActiveRecord::Base.configurations.each_value do |config|
9
+ task :all => :merb_start do
10
+ Merb::Orms::ActiveRecord.configurations.each_value do |config|
10
11
  create_local_database(config)
11
12
  end
12
13
  end
13
14
  end
14
15
 
15
16
  desc 'Create the local database defined in config/database.yml for the current Merb.environment'
16
- task :create => :environment do
17
- create_local_database(ActiveRecord::Base.configurations[Merb.environment])
17
+ task :create => :merb_start do
18
+ create_local_database(Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym])
18
19
  end
19
20
 
20
21
  def create_local_database(config)
@@ -26,15 +27,15 @@ namespace :db do
26
27
  rescue
27
28
  case config[:adapter]
28
29
  when 'mysql'
29
- #~ @charset = ENV['CHARSET'] || 'utf8'
30
- #~ @collation = ENV['COLLATION'] || 'utf8_general_ci'
30
+ @charset = ENV['CHARSET'] || 'utf8'
31
+ @collation = ENV['COLLATION'] || 'utf8_general_ci'
31
32
  begin
32
33
  ActiveRecord::Base.establish_connection(config.merge({:database => nil}))
33
- ActiveRecord::Base.connection.create_database(config[:database]) #, {:charset => @charset, :collation => @collation})
34
+ ActiveRecord::Base.connection.create_database(config[:database], {:charset => (config[:charset] || @charset), :collation => (config[:collation] || @collation)})
34
35
  ActiveRecord::Base.establish_connection(config)
35
- p "MySQL #{config[:database]} database succesfully created"
36
+ puts "MySQL #{config[:database]} database successfully created"
36
37
  rescue
37
- $stderr.puts "Couldn't create database for #{config.inspect}"
38
+ $stderr.puts "Couldn't create database for #{config.inspect}, charset: #{config[:charset] || @charset}, collation: #{config[:collation] || @collation} (if you set the charset manually, make sure you have a matching collation)"
38
39
  end
39
40
  when 'postgresql'
40
41
  `createdb "#{config[:database]}" -E utf8`
@@ -44,70 +45,131 @@ namespace :db do
44
45
  `sqlite3 "#{config[:database]}"`
45
46
  end
46
47
  else
47
- p "#{config[:database]} already exists"
48
+ puts "#{config[:database]} already exists"
48
49
  end
49
50
  else
50
- p "This task only creates local databases. #{config[:database]} is on a remote host."
51
+ puts "This task only creates local databases. #{config[:database]} is on a remote host."
51
52
  end
52
53
  end
53
-
54
- desc 'Drops the database for the current environment'
55
- task :drop => :environment do
56
- config = ActiveRecord::Base.configurations[Merb.environment || :development]
57
- p config
54
+
55
+ def drop_database(config)
58
56
  case config[:adapter]
59
57
  when 'mysql'
60
58
  ActiveRecord::Base.connection.drop_database config[:database]
61
59
  when /^sqlite/
62
- FileUtils.rm_f File.join(Merb.root, config[:database])
60
+ FileUtils.rm(File.join(RAILS_ROOT, config[:database]))
63
61
  when 'postgresql'
62
+ ActiveRecord::Base.clear_active_connections!
64
63
  `dropdb "#{config[:database]}"`
65
64
  end
66
65
  end
66
+
67
+ def local_database?(config, &block)
68
+ if %w( 127.0.0.1 localhost ).include?(config[:host]) || config[:host].blank?
69
+ yield
70
+ else
71
+ puts "This task only modifies local databases. #{config[:database]} is on a remote host."
72
+ end
73
+ end
74
+
75
+ namespace :drop do
76
+ desc 'Drops all the local databases defined in config/database.yml'
77
+ task :all => :merb_start do
78
+ Merb::Orms::ActiveRecord.configurations.each_value do |config|
79
+ # Skip entries that don't have a database key
80
+ next unless config[:database]
81
+ # Only connect to local databases
82
+ local_database?(config) { drop_database(config) }
83
+ end
84
+ end
85
+ end
67
86
 
87
+ desc 'Drops the database for the current environment (set MERB_ENV to target another environment)'
88
+ task :drop => :merb_start do
89
+ config = Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym]
90
+ begin
91
+ drop_database(config)
92
+ rescue Exception => e
93
+ puts "#{e.inspect} - #{config['database']} might have been already dropped"
94
+ end
95
+ end
96
+
68
97
  desc "Migrate the database through scripts in schema/migrations. Target specific version with VERSION=x"
69
- task :migrate => :environment do
98
+ task :migrate => :merb_start do
99
+ config = Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym]
100
+ ActiveRecord::Base.establish_connection(config)
70
101
  ActiveRecord::Migrator.migrate("schema/migrations/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
71
102
  Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
72
103
  end
73
104
 
74
- desc 'Drops, creates and then migrates the database for the current environment. Target specific version with VERSION=x'
75
- task :reset => ['db:drop', 'db:create', 'db:migrate']
105
+ namespace :migrate do
106
+ desc 'Rollbacks the database one migration and re migrate up. If you want to rollback more than one step, define STEP=x'
107
+ task :redo => [ 'db:rollback', 'db:migrate' ]
76
108
 
77
- # desc "Retrieves the charset for the current environment's database"
78
- # task :charset => :environment do
79
- # config = ActiveRecord::Base.configurations[Merb.environment || :development]
80
- # case config[:adapter]
81
- # when 'mysql'
82
- # ActiveRecord::Base.establish_connection(config)
83
- # puts ActiveRecord::Base.connection.charset
84
- # else
85
- # puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
86
- # end
87
- # end
109
+ desc 'Resets your database using your migrations for the current environment'
110
+ task :reset => ["db:drop", "db:create", "db:migrate"]
111
+ end
112
+
113
+ desc 'Drops and recreates the database from db/schema.rb for the current environment.'
114
+ task :reset => ['db:drop', 'db:create', 'db:schema:load']
115
+
116
+ desc 'Rolls the schema back to the previous version. Specify the number of steps with STEP=n'
117
+ task :rollback => :merb_start do
118
+ step = ENV['STEP'] ? ENV['STEP'].to_i : 1
119
+ version = ActiveRecord::Migrator.current_version - step
120
+ ActiveRecord::Migrator.migrate('schema/migrations/', version)
121
+ end
122
+
123
+ desc "Raises an error if there are pending migrations"
124
+ task :abort_if_pending_migrations => :merb_start do
125
+ if defined? ActiveRecord
126
+ pending_migrations = ActiveRecord::Migrator.new(:up, 'schema/migrations').pending_migrations
127
+
128
+ if pending_migrations.any?
129
+ puts "You have #{pending_migrations.size} pending migrations:"
130
+ pending_migrations.each do |pending_migration|
131
+ puts ' %4d %s' % [pending_migration.version, pending_migration.name]
132
+ end
133
+ abort "Run `rake db:migrate` to update your database then try again."
134
+ end
135
+ end
136
+ end
137
+
138
+ desc "Retrieves the charset for the current environment's database"
139
+ task :charset => :merb_start do
140
+ config = Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym]
141
+ case config[:adapter]
142
+ when 'mysql'
143
+ ActiveRecord::Base.establish_connection(config)
144
+ puts ActiveRecord::Base.connection.charset
145
+ else
146
+ puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
147
+ end
148
+ end
88
149
 
89
- # desc "Retrieves the collation for the current environment's database"
90
- # task :collation => :environment do
91
- # config = ActiveRecord::Base.configurations[Merb.environment || :development]
92
- # case config[:adapter]
93
- # when 'mysql'
94
- # ActiveRecord::Base.establish_connection(config)
95
- # puts ActiveRecord::Base.connection.collation
96
- # else
97
- # puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
98
- # end
99
- # end
150
+ desc "Retrieves the collation for the current environment's database"
151
+ task :collation => :merb_start do
152
+ config = Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym]
153
+ case config[:adapter]
154
+ when 'mysql'
155
+ ActiveRecord::Base.establish_connection(config)
156
+ puts ActiveRecord::Base.connection.collation
157
+ else
158
+ puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
159
+ end
160
+ end
100
161
 
101
162
  desc "Retrieves the current schema version number"
102
- task :version => :environment do
163
+ task :version => :merb_start do
103
164
  puts "Current version: #{ActiveRecord::Migrator.current_version}"
104
165
  end
105
166
 
106
167
  namespace :fixtures do
107
168
  desc "Load fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y"
108
- task :load => :environment do
169
+ task :load => :merb_start do
109
170
  require 'active_record/fixtures'
110
- ActiveRecord::Base.establish_connection(Merb.environment.to_sym)
171
+ config = Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym]
172
+ ActiveRecord::Base.establish_connection(config)
111
173
  (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(Merb.root, 'test', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
112
174
  Fixtures.create_fixtures('test/fixtures', File.basename(fixture_file, '.*'))
113
175
  end
@@ -116,7 +178,7 @@ namespace :db do
116
178
 
117
179
  namespace :schema do
118
180
  desc 'Create a schema/schema.rb file that can be portably used against any DB supported by AR'
119
- task :dump do
181
+ task :dump => :merb_start do
120
182
  require 'active_record/schema_dumper'
121
183
  File.open(ENV['SCHEMA'] || "schema/schema.rb", "w") do |file|
122
184
  ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
@@ -124,7 +186,9 @@ namespace :db do
124
186
  end
125
187
 
126
188
  desc "Load a schema.rb file into the database"
127
- task :load do
189
+ task :load => :merb_start do
190
+ config = Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym]
191
+ ActiveRecord::Base.establish_connection(config)
128
192
  file = ENV['SCHEMA'] || "schema/schema.rb"
129
193
  load(file)
130
194
  end
@@ -132,11 +196,11 @@ namespace :db do
132
196
 
133
197
  namespace :structure do
134
198
  desc "Dump the database structure to a SQL file"
135
- task :dump do
136
- config = ActiveRecord::Base.configurations[Merb.environment.to_sym]
199
+ task :dump => :merb_start do
200
+ config = Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym]
137
201
  case config[:adapter]
138
202
  when "mysql", "oci", "oracle"
139
- ActiveRecord::Base.establish_connection(config[Merb.environment])
203
+ ActiveRecord::Base.establish_connection(config)
140
204
  File.open("schema/#{Merb.environment}_structure.sql", "w+") { |f| f << ActiveRecord::Base.connection.structure_dump }
141
205
  when "postgresql"
142
206
  ENV['PGHOST'] = config[:host] if config[:host]
@@ -153,8 +217,8 @@ namespace :db do
153
217
  `scptxfr /s #{config[:host]} /d #{config[:database]} /I /f schema\\#{Merb.environment}_structure.sql /q /A /r`
154
218
  `scptxfr /s #{config[:host]} /d #{config[:database]} /I /F schema\ /q /A /r`
155
219
  when "firebird"
156
- set_firebird_env(config[Merb.environment])
157
- db_string = firebird_db_string(config[Merb.environment])
220
+ set_firebird_env(config)
221
+ db_string = firebird_db_string(config)
158
222
  sh "isql -a #{db_string} > schema/#{Merb.environment}_structure.sql"
159
223
  else
160
224
  raise "Task not supported by '#{config[:adapter]}'"
@@ -167,19 +231,21 @@ namespace :db do
167
231
  end
168
232
 
169
233
  namespace :test do
234
+
170
235
  desc "Recreate the test database from the current environment's database schema"
171
236
  task :clone => %w(db:schema:dump db:test:purge) do
172
- ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[:test])
237
+ ActiveRecord::Base.establish_connection(Merb::Orms::ActiveRecord.configurations[:test])
173
238
  ActiveRecord::Schema.verbose = false
239
+ Merb.environment = 'test'
174
240
  Rake::Task["db:schema:load"].invoke
175
241
  end
176
242
 
177
243
  desc "Recreate the test databases from the development structure"
178
244
  task :clone_structure => [ "db:structure:dump", "db:test:purge" ] do
179
- config = ActiveRecord::Base.configurations[:test]
245
+ config = Merb::Orms::ActiveRecord.configurations[:test]
180
246
  case config[:adapter]
181
247
  when "mysql"
182
- ActiveRecord::Base.establish_connection(:test)
248
+ ActiveRecord::Base.establish_connection(config)
183
249
  ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0')
184
250
  IO.readlines("schema/#{Merb.environment}_structure.sql").join.split("\n\n").each do |table|
185
251
  ActiveRecord::Base.connection.execute(table)
@@ -209,11 +275,12 @@ namespace :db do
209
275
  end
210
276
 
211
277
  desc "Empty the test database"
212
- task :purge do
213
- config = ActiveRecord::Base.configurations[:test]
278
+ task :purge => :merb_start do
279
+ config = Merb::Orms::ActiveRecord.configurations[:test]
280
+ puts "config => #{config.inspect}"
214
281
  case config[:adapter]
215
282
  when "mysql"
216
- ActiveRecord::Base.establish_connection(:test)
283
+ ActiveRecord::Base.establish_connection(config)
217
284
  ActiveRecord::Base.connection.recreate_database(config[:database])
218
285
  when "postgresql"
219
286
  ENV['PGHOST'] = config[:host] if config[:host]
@@ -241,7 +308,7 @@ namespace :db do
241
308
 
242
309
  desc "Prepare the test database and load the schema"
243
310
  task :prepare => ["db:test:clone_structure", "db:test:clone"] do
244
- if defined?(ActiveRecord::Base) && !ActiveRecord::Base.configurations.blank?
311
+ if defined?(ActiveRecord::Base) && !Merb::Orms::ActiveRecord.configurations.blank?
245
312
  Rake::Task[{ :sql => "db:test:clone_structure", :ruby => "db:test:clone" }[ActiveRecord::Base.schema_format]].invoke
246
313
  end
247
314
  end
@@ -257,7 +324,7 @@ namespace :db do
257
324
  # end
258
325
 
259
326
  desc "Clear the sessions table"
260
- task :clear => :environment do
327
+ task :clear => :merb_start do
261
328
  session_table = 'session'
262
329
  session_table = Inflector.pluralize(session_table) if ActiveRecord::Base.pluralize_table_names
263
330
  ActiveRecord::Base.connection.execute "DELETE FROM #{session_table}"
@@ -4,31 +4,54 @@ require 'active_record'
4
4
  module Merb
5
5
  module Orms
6
6
  module ActiveRecord
7
+
8
+ # Start a transaction.
9
+ #
10
+ # Used by Merb::Rack::Console#open_sandbox!
11
+ def self.open_sandbox!
12
+ ::ActiveRecord::Base.send :increment_open_transactions
13
+ ::ActiveRecord::Base.connection.begin_db_transaction
14
+ end
15
+
16
+ # Rollback a transaction.
17
+ #
18
+ # Used by Merb::Rack::Console#open_sandbox!
19
+ def self.close_sandbox!
20
+ ::ActiveRecord::Base.connection.rollback_db_transaction
21
+ ::ActiveRecord::Base.send :decrement_open_transactions
22
+ end
23
+
7
24
  class << self
8
- def config_file() Merb.root / "config" / "database.yml" end
9
- def sample_dest() Merb.root / "config" / "database.sample.yml" end
10
- def sample_source() File.dirname(__FILE__) / "database.sample.yml" end
25
+ def config_file() Merb.dir_for(:config) / "database.yml" end
26
+ def sample_dest() Merb.dir_for(:config) / "database.yml.sample" end
27
+ def sample_source() File.dirname(__FILE__) / "database.yml.sample" end
11
28
 
12
29
  def copy_sample_config
13
30
  FileUtils.cp sample_source, sample_dest unless File.exists?(sample_dest)
14
31
  end
15
32
 
16
33
  def config
17
- @config ||=
34
+ @config ||= (Merb::Plugins.config[:merb_active_record] = configurations[Merb.environment.to_sym])
35
+ end
36
+
37
+ def configurations
38
+ @configurations ||=
18
39
  begin
19
- # Convert string keys to symbols
20
- full_config = Erubis.load_yaml_file(config_file)
21
- config = (Merb::Plugins.config[:merb_active_record] = {})
22
- (full_config[Merb.environment.to_sym] || full_config[Merb.environment]).each { |k, v| config[k.to_sym] = v }
23
- ::ActiveRecord::Base.configurations= full_config
24
- config
40
+ #A proc that will recursively intern(a.k.a symbolize) the keys of the hash
41
+ intern_keys = lambda { |x|
42
+ x.inject({}) do |y, (k,v)|
43
+ y[k.to_sym || k] = v.is_a?(Hash) ? intern_keys.call(v) : v
44
+ y
45
+ end
46
+ }
47
+ intern_keys.call(Erubis.load_yaml_file(config_file))
25
48
  end
26
49
  end
27
50
 
28
51
  # Database connects as soon as the gem is loaded
29
52
  def connect
30
53
  if File.exists?(config_file)
31
- puts "Connecting to database..."
54
+ Merb.logger.info!("Connecting to database...")
32
55
 
33
56
  Thread.new{ loop{ sleep(60*60); ::ActiveRecord::Base.verify_active_connections! } }.priority = -10
34
57
 
@@ -37,8 +60,8 @@ module Merb
37
60
  ::ActiveRecord::Base.establish_connection config
38
61
  else
39
62
  copy_sample_config
40
- puts "No database.yml file found in #{Merb.root}/config."
41
- puts "A sample file was created called database.sample.yml for you to copy and edit."
63
+ Merb.logger.error! "No database.yml file found in #{Merb.root}/config."
64
+ Merb.logger.error! "A sample file was created called database.sample.yml for you to copy and edit."
42
65
  exit(1)
43
66
  end
44
67
  end
@@ -46,9 +69,9 @@ module Merb
46
69
  # Registering this ORM lets the user choose active_record as a session
47
70
  # in merb.yml's session_store: option.
48
71
  def register_session_type
49
- Merb::BootLoader.register_session_type("activerecord",
50
- "merb/session/active_record_session",
51
- "Using ActiveRecord database sessions")
72
+ Merb.register_session_type("activerecord",
73
+ "merb/session/active_record_session",
74
+ "Using ActiveRecord database sessions")
52
75
  end
53
76
  end
54
77
  end
@@ -7,6 +7,7 @@
7
7
  :password: secrets
8
8
  :host: localhost
9
9
  :socket: /tmp/mysql.sock
10
+ :encoding: utf8
10
11
 
11
12
  :test:
12
13
  <<: *defaults
@@ -3,7 +3,6 @@ require "active_record"
3
3
  module Merb
4
4
  module SessionMixin
5
5
  def setup_session
6
- Merb.logger.info("Setting up session")
7
6
  before = cookies[_session_id_key]
8
7
  request.session, cookies[_session_id_key] = Merb::ActiveRecordSession.persist(cookies[_session_id_key])
9
8
  @_fingerprint = Marshal.dump(request.session.data).hash
@@ -11,9 +10,12 @@ module Merb
11
10
  end
12
11
 
13
12
  def finalize_session
14
- Merb.logger.info("Finalize session")
15
13
  request.session.save if @_fingerprint != Marshal.dump(request.session.data).hash
16
- set_cookie(_session_id_key, request.session.session_id, _session_expiry) if (@_new_cookie || request.session.needs_new_cookie)
14
+ set_cookie(_session_id_key, request.session.session_id, Time.now + _session_expiry) if (@_new_cookie || request.session.needs_new_cookie)
15
+ end
16
+
17
+ def session_store_type
18
+ "activerecord"
17
19
  end
18
20
  end # ActiveRecordMixin
19
21
 
@@ -99,6 +101,10 @@ module Merb
99
101
  def each(&b)
100
102
  data.each(&b)
101
103
  end
104
+
105
+ def each_with_index(&b)
106
+ data.each_with_index(&b)
107
+ end
102
108
 
103
109
  def []=(key, val)
104
110
  data[key] = val
@@ -1,11 +1,17 @@
1
- # make sure we're running inside Merb
2
- if defined?(Merb::Plugins)
3
- if Merb::BootLoader.app_loaded?
4
- puts "Warning: The merb_active_record gem must be loaded before the application"
5
- else
6
- require "merb/orms/active_record/connection"
7
- Merb::Orms::ActiveRecord.connect
8
- Merb::Orms::ActiveRecord.register_session_type
1
+ if defined?(Merb::Plugins)
2
+ dependency "activerecord"
3
+ require File.join(File.dirname(__FILE__) / "merb" / "orms" / "active_record" / "connection")
4
+ Merb::Plugins.add_rakefiles(File.join(File.dirname(__FILE__) / "active_record" / "merbtasks"))
5
+
6
+ class Merb::Orms::ActiveRecord::Connect < Merb::BootLoader
7
+
8
+ after BeforeAppRuns
9
+
10
+ def self.run
11
+ Merb::Orms::ActiveRecord.connect
12
+ Merb::Orms::ActiveRecord.register_session_type
13
+ end
14
+
9
15
  end
10
- Merb::Plugins.add_rakefiles "merb/orms/active_record/tasks/databases"
11
- end
16
+
17
+ end
metadata CHANGED
@@ -1,96 +1,112 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0
3
- specification_version: 1
4
2
  name: merb_activerecord
5
3
  version: !ruby/object:Gem::Version
6
- version: "0.5"
7
- date: 2008-01-09 00:00:00 -08:00
8
- summary: Merb plugin that provides ActiveRecord support for Merb
9
- require_paths:
10
- - lib
11
- email: canadaduane@gmail.com
12
- homepage: http://merbivore.com
13
- rubyforge_project:
14
- description: Merb plugin that provides ActiveRecord support for Merb
15
- autorequire: merb_activerecord
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: 0.9.2
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
7
  - Duane Johnson
8
+ autorequire: merb_activerecord
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-03-24 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: merb-core
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.9.2
23
+ version:
24
+ description: Merb plugin that provides ActiveRecord support for Merb
25
+ email: canadaduane@gmail.com
26
+ executables: []
27
+
28
+ extensions: []
29
+
30
+ extra_rdoc_files:
31
+ - README
32
+ - LICENSE
33
+ - TODO
31
34
  files:
32
35
  - LICENSE
33
36
  - README
34
37
  - Rakefile
35
38
  - TODO
39
+ - lib/active_record
40
+ - lib/active_record/merbtasks.rb
36
41
  - lib/merb
37
- - lib/merb_activerecord.rb
38
42
  - lib/merb/orms
39
- - lib/merb/session
40
43
  - lib/merb/orms/active_record
41
44
  - lib/merb/orms/active_record/connection.rb
42
- - lib/merb/orms/active_record/database.sample.yml
43
- - lib/merb/orms/active_record/tasks
44
- - lib/merb/orms/active_record/tasks/databases.rb
45
+ - lib/merb/orms/active_record/database.yml.sample
46
+ - lib/merb/session
45
47
  - lib/merb/session/active_record_session.rb
48
+ - lib/merb_activerecord.rb
46
49
  - specs/merb_active_record_spec.rb
47
50
  - specs/spec_helper.rb
48
51
  - activerecord_generators/database_sessions_migration
49
- - activerecord_generators/migration
50
- - activerecord_generators/model
51
- - activerecord_generators/resource_controller
52
52
  - activerecord_generators/database_sessions_migration/database_sessions_migration_generator.rb
53
53
  - activerecord_generators/database_sessions_migration/templates
54
- - activerecord_generators/database_sessions_migration/USAGE
55
54
  - activerecord_generators/database_sessions_migration/templates/sessions_migration.erb
55
+ - activerecord_generators/database_sessions_migration/USAGE
56
+ - activerecord_generators/migration
56
57
  - activerecord_generators/migration/migration_generator.rb
57
58
  - activerecord_generators/migration/templates
59
+ - activerecord_generators/migration/templates/schema
60
+ - activerecord_generators/migration/templates/schema/migrations
61
+ - activerecord_generators/migration/templates/schema/migrations/%migration_file_name%.rb
58
62
  - activerecord_generators/migration/USAGE
59
- - activerecord_generators/migration/templates/new_migration.erb
63
+ - activerecord_generators/model
60
64
  - activerecord_generators/model/model_generator.rb
61
65
  - activerecord_generators/model/templates
66
+ - activerecord_generators/model/templates/app
67
+ - activerecord_generators/model/templates/app/models
68
+ - activerecord_generators/model/templates/app/models/%model_file_name%.rb
62
69
  - activerecord_generators/model/USAGE
63
- - activerecord_generators/model/templates/new_model.erb
70
+ - activerecord_generators/resource_controller
64
71
  - activerecord_generators/resource_controller/resource_controller_generator.rb
65
72
  - activerecord_generators/resource_controller/templates
73
+ - activerecord_generators/resource_controller/templates/app
74
+ - activerecord_generators/resource_controller/templates/app/controllers
75
+ - activerecord_generators/resource_controller/templates/app/controllers/%controller_file_name%.rb
76
+ - activerecord_generators/resource_controller/templates/app/helpers
77
+ - activerecord_generators/resource_controller/templates/app/helpers/%controller_file_name%_helper.rb
78
+ - activerecord_generators/resource_controller/templates/app/views
79
+ - activerecord_generators/resource_controller/templates/app/views/%controller_file_name%
80
+ - activerecord_generators/resource_controller/templates/app/views/%controller_file_name%/edit.html.erb
81
+ - activerecord_generators/resource_controller/templates/app/views/%controller_file_name%/index.html.erb
82
+ - activerecord_generators/resource_controller/templates/app/views/%controller_file_name%/new.html.erb
83
+ - activerecord_generators/resource_controller/templates/app/views/%controller_file_name%/show.html.erb
66
84
  - activerecord_generators/resource_controller/USAGE
67
- - activerecord_generators/resource_controller/templates/controller.rb
68
- - activerecord_generators/resource_controller/templates/edit.html.erb
69
- - activerecord_generators/resource_controller/templates/helper.rb
70
- - activerecord_generators/resource_controller/templates/index.html.erb
71
- - activerecord_generators/resource_controller/templates/new.html.erb
72
- - activerecord_generators/resource_controller/templates/show.html.erb
73
- test_files: []
74
-
85
+ has_rdoc: true
86
+ homepage: http://merbivore.com
87
+ post_install_message:
75
88
  rdoc_options: []
76
89
 
77
- extra_rdoc_files:
78
- - README
79
- - LICENSE
80
- - TODO
81
- executables: []
82
-
83
- extensions: []
84
-
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: "0"
97
+ version:
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: "0"
103
+ version:
85
104
  requirements: []
86
105
 
87
- dependencies:
88
- - !ruby/object:Gem::Dependency
89
- name: merb
90
- version_requirement:
91
- version_requirements: !ruby/object:Gem::Version::Requirement
92
- requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- version: "0.5"
96
- version:
106
+ rubyforge_project:
107
+ rubygems_version: 1.0.1
108
+ signing_key:
109
+ specification_version: 2
110
+ summary: Merb plugin that provides ActiveRecord support for Merb
111
+ test_files: []
112
+
@@ -1,15 +0,0 @@
1
- class <%= class_name.snake_case.camel_case %> < ActiveRecord::Migration
2
- def self.up
3
- <%= "create_table :#{table_name} do |t|" if table_name %>
4
- <% for attribute in table_attributes -%>
5
- t.column :<%= attribute.name %>, :<%= attribute.type %>
6
- <% end -%>
7
- <%= "end" if table_name %>
8
- end
9
-
10
- def self.down
11
- <% if table_name -%>
12
- drop_table :<%= table_name %>
13
- <% end -%>
14
- end
15
- end
@@ -1,2 +0,0 @@
1
- class <%= class_name %> < ActiveRecord::Base
2
- end
@@ -1,54 +0,0 @@
1
- <% klass = class_name.singularize -%>
2
- <% ivar = class_name.snake_case.singularize -%>
3
- class <%= class_name %> < Application
4
- provides :xml, :js, :yaml
5
-
6
- def index
7
- @<%= ivar.pluralize %> = <%= klass %>.find(:all)
8
- render @<%= ivar.pluralize %>
9
- end
10
-
11
- def show
12
- @<%= ivar %> = <%= klass %>.find(params[:id])
13
- render @<%= ivar %>
14
- end
15
-
16
- def new
17
- only_provides :html
18
- @<%= ivar %> = <%= klass %>.new(params[:<%= ivar %>])
19
- render
20
- end
21
-
22
- def create
23
- @<%= ivar %> = <%= klass %>.new(params[:<%= ivar %>])
24
- if @<%= ivar %>.save
25
- redirect url(:<%= ivar %>, @<%= ivar %>)
26
- else
27
- render :action => :new
28
- end
29
- end
30
-
31
- def edit
32
- only_provides :html
33
- @<%= ivar %> = <%= klass %>.find(params[:id])
34
- render
35
- end
36
-
37
- def update
38
- @<%= ivar %> = <%= klass %>.find(params[:id])
39
- if @<%= ivar %>.update_attributes(params[:<%= ivar %>])
40
- redirect url(:<%= ivar %>, @<%= ivar %>)
41
- else
42
- raise BadRequest
43
- end
44
- end
45
-
46
- def destroy
47
- @<%= ivar %> = <%= klass %>.find(params[:id])
48
- if @<%= ivar %>.destroy
49
- redirect url(:<%= ivar %>s)
50
- else
51
- raise BadRequest
52
- end
53
- end
54
- end
@@ -1 +0,0 @@
1
- Edit for <%= class_name %>
@@ -1,5 +0,0 @@
1
- module Merb
2
- module <%= class_name %>Helper
3
-
4
- end
5
- end
@@ -1 +0,0 @@
1
- Index for <%= class_name %>
@@ -1 +0,0 @@
1
- New for <%= class_name %>
@@ -1 +0,0 @@
1
- Show for <%= class_name %>