scaffolding_extensions 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +6 -6
- data/doc/merb.txt +13 -0
- data/lib/scaffolding_extensions/controller/action_controller.rb +2 -2
- data/lib/scaffolding_extensions/controller/merb.rb +123 -0
- data/lib/scaffolding_extensions/model/active_record.rb +36 -4
- data/lib/scaffolding_extensions.rb +1 -1
- metadata +6 -5
- data/lib/scaffolding_extensions/model/ardm.rb +0 -42
- data/lib/scaffolding_extensions/model/data_mapper.rb +0 -174
data/README
CHANGED
@@ -21,14 +21,14 @@ to better suit your needs.
|
|
21
21
|
Scaffolding Extensions currently supports:
|
22
22
|
|
23
23
|
* Web Frameworks
|
24
|
-
* Rails 2.
|
25
|
-
* Ramaze 2008.
|
24
|
+
* Rails 2.2.2
|
25
|
+
* Ramaze 2008.11
|
26
26
|
* Camping 1.5
|
27
|
-
* Sinatra 0.3.
|
27
|
+
* Sinatra 0.3.2
|
28
|
+
* Merb 1.0.4
|
28
29
|
* Object/Relational Mappers
|
29
|
-
* ActiveRecord 2.
|
30
|
-
*
|
31
|
-
* Sequel 2.5.0
|
30
|
+
* ActiveRecord 2.2.2
|
31
|
+
* Sequel 2.8.0
|
32
32
|
* Javascript Libaries (used for Ajax/Autocompleting)
|
33
33
|
* Prototype 1.6.0.1
|
34
34
|
* JQuery 1.2.3
|
data/doc/merb.txt
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
To use this plugin after installing the gem, somewhere in your Merb config,
|
2
|
+
add:
|
3
|
+
|
4
|
+
require 'scaffolding_extensions'
|
5
|
+
|
6
|
+
Then you can use scaffold, scaffold_habtm, or scaffold_all_models in your
|
7
|
+
controllers:
|
8
|
+
|
9
|
+
class Admin < Merb::Controller
|
10
|
+
scaffold Model1
|
11
|
+
scaffold_habtm Model1, :things
|
12
|
+
scaffold_all_models :only=>[Model1, Model2, Model3]
|
13
|
+
end
|
@@ -23,7 +23,7 @@ module ScaffoldingExtensions
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
# Instance methods for ActionController::Base
|
26
|
+
# Instance methods for ActionController::Base necessary for Scaffolding Extensions
|
27
27
|
module ActionController
|
28
28
|
private
|
29
29
|
def scaffold_flash
|
@@ -93,7 +93,7 @@ module ScaffoldingExtensions
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
-
# Class methods for ActionController::Base
|
96
|
+
# Class methods for ActionController::Base necessary for Scaffolding Extensions
|
97
97
|
module MetaActionController
|
98
98
|
private
|
99
99
|
# Adds a before filter for checking nonidempotent requests use method POST
|
@@ -0,0 +1,123 @@
|
|
1
|
+
module ScaffoldingExtensions
|
2
|
+
class << self
|
3
|
+
private
|
4
|
+
# Use whatever model directory Merb is using.
|
5
|
+
def model_files
|
6
|
+
@model_files ||= Dir["#{Merb.dir_for(:model)}/*.rb"]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
# Helper methods for Merb that override the defaults in Scaffolding Extensions
|
11
|
+
module MerbControllerHelper
|
12
|
+
private
|
13
|
+
# Merb apparently requires that params that are desired to be lists have
|
14
|
+
# the suffix '[]'
|
15
|
+
def scaffold_param_list_suffix
|
16
|
+
'[]'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Instance methods for Merb necessary for Scaffolding Extensions
|
21
|
+
module MerbController
|
22
|
+
private
|
23
|
+
def scaffold_flash
|
24
|
+
message
|
25
|
+
end
|
26
|
+
|
27
|
+
def scaffold_method_not_allowed
|
28
|
+
render('', :status=>405)
|
29
|
+
end
|
30
|
+
|
31
|
+
def scaffold_redirect_to(url)
|
32
|
+
redirect("#{request.protocol}://#{request.host}#{url}")
|
33
|
+
end
|
34
|
+
|
35
|
+
# Renders user provided template if it exists, otherwise renders a scaffold template.
|
36
|
+
# If a layout is specified (either in the controller or as an render_option), use that layout,
|
37
|
+
# otherwise uses the scaffolded layout. If :inline is one of the render_options,
|
38
|
+
# use the contents of it as the template without the layout.
|
39
|
+
#
|
40
|
+
# There may well be a much better way to do this via modifying the _template_roots, but
|
41
|
+
# I didn't have much luck and decided to take the path I used with Camping and Sinatra,
|
42
|
+
# rendering the templates directly.
|
43
|
+
def scaffold_render_template(action, options = {}, render_options = {})
|
44
|
+
suffix = options[:suffix]
|
45
|
+
suffix_action = "#{action}#{suffix}".to_sym
|
46
|
+
@scaffold_options ||= options
|
47
|
+
@scaffold_suffix ||= suffix
|
48
|
+
@scaffold_class ||= @scaffold_options[:class]
|
49
|
+
begin
|
50
|
+
render(suffix_action, render_options)
|
51
|
+
rescue Merb::ControllerExceptions::TemplateNotFound
|
52
|
+
if render_options.include?(:inline)
|
53
|
+
headers['Content-Type'] = 'text/javascript' if @scaffold_javascript
|
54
|
+
render(Erubis::Eruby.new(render_options[:inline]).result(binding), {:layout=>false}.merge(render_options))
|
55
|
+
else
|
56
|
+
html = Erubis::Eruby.new(File.read(scaffold_path(action))).result(binding)
|
57
|
+
merb_layout = begin
|
58
|
+
merb_layout = _get_layout
|
59
|
+
rescue Merb::ControllerExceptions::TemplateNotFound
|
60
|
+
merb_layout = false
|
61
|
+
end
|
62
|
+
if merb_layout
|
63
|
+
render(html, render_options)
|
64
|
+
else
|
65
|
+
@content = html
|
66
|
+
render(Erubis::Eruby.new(File.read(scaffold_path('layout'))).result(binding), render_options.merge(:layout=>false))
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def scaffold_request_action
|
73
|
+
params[:action]
|
74
|
+
end
|
75
|
+
|
76
|
+
def scaffold_request_env
|
77
|
+
request.env
|
78
|
+
end
|
79
|
+
|
80
|
+
# Merb overrides any given query params with the path params even if the
|
81
|
+
# path params are nil. Work around it by getting the query params
|
82
|
+
# directly.
|
83
|
+
def scaffold_request_id
|
84
|
+
params[:id] || request.send(:query_params)[:id]
|
85
|
+
end
|
86
|
+
|
87
|
+
def scaffold_request_method
|
88
|
+
request.method.to_s.upcase
|
89
|
+
end
|
90
|
+
|
91
|
+
def scaffold_request_param(v)
|
92
|
+
params[v]
|
93
|
+
end
|
94
|
+
|
95
|
+
def scaffold_session
|
96
|
+
session
|
97
|
+
end
|
98
|
+
|
99
|
+
def scaffold_url(action, options = {})
|
100
|
+
url(options.merge(:controller=>controller_name, :action=>action))
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Class methods for Merb necessary for Scaffolding Extensions
|
105
|
+
module MetaMerbController
|
106
|
+
private
|
107
|
+
# Adds a before filter for checking nonidempotent requests use method POST
|
108
|
+
def scaffold_setup_helper
|
109
|
+
include ScaffoldingExtensions::Helper
|
110
|
+
include ScaffoldingExtensions::MerbControllerHelper
|
111
|
+
include ScaffoldingExtensions::PrototypeHelper
|
112
|
+
include ScaffoldingExtensions::Controller
|
113
|
+
include ScaffoldingExtensions::MerbController
|
114
|
+
before :scaffold_check_nonidempotent_requests
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# Add class methods necessary for Scaffolding Extensions
|
120
|
+
class Merb::Controller
|
121
|
+
extend ScaffoldingExtensions::MetaController
|
122
|
+
extend ScaffoldingExtensions::MetaMerbController
|
123
|
+
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'scaffolding_extensions/model/ardm'
|
2
|
-
|
3
1
|
ScaffoldingExtensions::MODEL_SUPERCLASSES << ::ActiveRecord::Base
|
4
2
|
|
5
3
|
# Instance methods added to ActiveRecord::Base to allow it to work with Scaffolding Extensions.
|
@@ -8,6 +6,11 @@ module ScaffoldingExtensions::ActiveRecord
|
|
8
6
|
def scaffold_attribute_value(field)
|
9
7
|
self[field]
|
10
8
|
end
|
9
|
+
|
10
|
+
# the value of the primary key for this object
|
11
|
+
def scaffold_id
|
12
|
+
id
|
13
|
+
end
|
11
14
|
end
|
12
15
|
|
13
16
|
# Class methods added to ActiveRecord::Base to allow it to work with Scaffolding Extensions.
|
@@ -138,6 +141,32 @@ module ScaffoldingExtensions::MetaActiveRecord
|
|
138
141
|
end
|
139
142
|
|
140
143
|
private
|
144
|
+
# Merge an array of conditions into a single condition array
|
145
|
+
def scaffold_merge_conditions(conditions)
|
146
|
+
new_conditions = [[]]
|
147
|
+
if Array === conditions
|
148
|
+
if conditions.length == 0 || (conditions.length == 1 && conditions[0].nil?)
|
149
|
+
nil
|
150
|
+
elsif Array === conditions[0]
|
151
|
+
conditions.each do |cond|
|
152
|
+
next unless cond
|
153
|
+
new_conditions[0] << cond.shift
|
154
|
+
cond.each{|c| new_conditions << c}
|
155
|
+
end
|
156
|
+
if new_conditions[0].length > 0
|
157
|
+
new_conditions[0] = "(#{new_conditions[0].join(") AND (")})"
|
158
|
+
new_conditions
|
159
|
+
else
|
160
|
+
nil
|
161
|
+
end
|
162
|
+
else
|
163
|
+
conditions
|
164
|
+
end
|
165
|
+
else
|
166
|
+
conditions
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
141
170
|
# Updates associated records for a given reflection and from record to point to the
|
142
171
|
# to record
|
143
172
|
def scaffold_reflection_merge(reflection, from, to)
|
@@ -153,16 +182,19 @@ module ScaffoldingExtensions::MetaActiveRecord
|
|
153
182
|
end
|
154
183
|
connection.update(sql)
|
155
184
|
end
|
185
|
+
|
186
|
+
# Remove the associated object from object's association
|
187
|
+
def scaffold_remove_associated_object(association, object, associated_object)
|
188
|
+
object.send(association).delete(associated_object)
|
189
|
+
end
|
156
190
|
end
|
157
191
|
|
158
192
|
# Add the class methods and instance methods from Scaffolding Extensions
|
159
193
|
class ActiveRecord::Base
|
160
194
|
SCAFFOLD_OPTIONS = ::ScaffoldingExtensions::MetaModel::SCAFFOLD_OPTIONS
|
161
195
|
include ScaffoldingExtensions::Model
|
162
|
-
include ScaffoldingExtensions::ARDM
|
163
196
|
include ScaffoldingExtensions::ActiveRecord
|
164
197
|
extend ScaffoldingExtensions::MetaModel
|
165
|
-
extend ScaffoldingExtensions::MetaARDM
|
166
198
|
extend ScaffoldingExtensions::MetaActiveRecord
|
167
199
|
extend ScaffoldingExtensions::Overridable
|
168
200
|
end
|
@@ -82,9 +82,9 @@ require 'scaffolding_extensions/controller/action_controller' if defined? Action
|
|
82
82
|
require 'scaffolding_extensions/controller/camping' if defined? Camping::Controllers
|
83
83
|
require 'scaffolding_extensions/controller/ramaze' if defined? Ramaze::Controller
|
84
84
|
require 'scaffolding_extensions/controller/sinatra' if defined? Sinatra
|
85
|
+
require 'scaffolding_extensions/controller/merb' if defined? Merb
|
85
86
|
|
86
87
|
require 'scaffolding_extensions/model/active_record' if defined? ActiveRecord::Base
|
87
|
-
require 'scaffolding_extensions/model/data_mapper' if defined? DataMapper::Base
|
88
88
|
require 'scaffolding_extensions/model/sequel' if defined? Sequel::Model
|
89
89
|
|
90
90
|
ScaffoldingExtensions.javascript_library = 'Prototype'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scaffolding_extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-12-10 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -32,6 +32,7 @@ files:
|
|
32
32
|
- lib/scaffolding_extensions/controller/camping.rb
|
33
33
|
- lib/scaffolding_extensions/controller/ramaze.rb
|
34
34
|
- lib/scaffolding_extensions/controller/sinatra.rb
|
35
|
+
- lib/scaffolding_extensions/controller/merb.rb
|
35
36
|
- lib/scaffolding_extensions/helper.rb
|
36
37
|
- lib/scaffolding_extensions/jquery_helper.rb
|
37
38
|
- lib/scaffolding_extensions/meta_controller.rb
|
@@ -39,8 +40,6 @@ files:
|
|
39
40
|
- lib/scaffolding_extensions/model.rb
|
40
41
|
- lib/scaffolding_extensions/model
|
41
42
|
- lib/scaffolding_extensions/model/active_record.rb
|
42
|
-
- lib/scaffolding_extensions/model/ardm.rb
|
43
|
-
- lib/scaffolding_extensions/model/data_mapper.rb
|
44
43
|
- lib/scaffolding_extensions/model/sequel.rb
|
45
44
|
- lib/scaffolding_extensions/overridable.rb
|
46
45
|
- lib/scaffolding_extensions/prototype_helper.rb
|
@@ -53,6 +52,7 @@ files:
|
|
53
52
|
- doc/ramaze.txt
|
54
53
|
- doc/sinatra.txt
|
55
54
|
- doc/testing.txt
|
55
|
+
- doc/merb.txt
|
56
56
|
- contrib/scaffold_associations_tree
|
57
57
|
- contrib/scaffold_associations_tree/README
|
58
58
|
- contrib/scaffold_associations_tree/bullet.gif
|
@@ -98,6 +98,7 @@ rdoc_options:
|
|
98
98
|
- doc/ramaze.txt
|
99
99
|
- doc/sinatra.txt
|
100
100
|
- doc/testing.txt
|
101
|
+
- doc/merb.txt
|
101
102
|
require_paths:
|
102
103
|
- lib
|
103
104
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -115,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
116
|
requirements: []
|
116
117
|
|
117
118
|
rubyforge_project: scaffolding-ext
|
118
|
-
rubygems_version: 1.
|
119
|
+
rubygems_version: 1.3.1
|
119
120
|
signing_key:
|
120
121
|
specification_version: 2
|
121
122
|
summary: Administrative database front-end for multiple web-frameworks and ORMs
|
@@ -1,42 +0,0 @@
|
|
1
|
-
# Instance methods used by both ActiveRecord and Datamapper
|
2
|
-
module ScaffoldingExtensions::ARDM
|
3
|
-
# the value of the primary key for this object
|
4
|
-
def scaffold_id
|
5
|
-
id
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
# Class methods used by both ActiveRecord and DataMapper
|
10
|
-
module ScaffoldingExtensions::MetaARDM
|
11
|
-
private
|
12
|
-
# Merge an array of conditions into a single condition array
|
13
|
-
def scaffold_merge_conditions(conditions)
|
14
|
-
new_conditions = [[]]
|
15
|
-
if Array === conditions
|
16
|
-
if conditions.length == 0 || (conditions.length == 1 && conditions[0].nil?)
|
17
|
-
nil
|
18
|
-
elsif Array === conditions[0]
|
19
|
-
conditions.each do |cond|
|
20
|
-
next unless cond
|
21
|
-
new_conditions[0] << cond.shift
|
22
|
-
cond.each{|c| new_conditions << c}
|
23
|
-
end
|
24
|
-
if new_conditions[0].length > 0
|
25
|
-
new_conditions[0] = "(#{new_conditions[0].join(") AND (")})"
|
26
|
-
new_conditions
|
27
|
-
else
|
28
|
-
nil
|
29
|
-
end
|
30
|
-
else
|
31
|
-
conditions
|
32
|
-
end
|
33
|
-
else
|
34
|
-
conditions
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
# Remove the associated object from object's association
|
39
|
-
def scaffold_remove_associated_object(association, object, associated_object)
|
40
|
-
object.send(association).delete(associated_object)
|
41
|
-
end
|
42
|
-
end
|
@@ -1,174 +0,0 @@
|
|
1
|
-
require 'scaffolding_extensions/model/ardm'
|
2
|
-
|
3
|
-
ScaffoldingExtensions::MODEL_SUPERCLASSES << ::DataMapper::Base
|
4
|
-
|
5
|
-
# Instance methods added to DataMapper::Base to allow it to work with Scaffolding Extensions.
|
6
|
-
module ScaffoldingExtensions::DataMapper
|
7
|
-
# Get value for given attribute
|
8
|
-
def scaffold_attribute_value(field)
|
9
|
-
attributes[field]
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
# Class methods added to DataMapper::Base to allow it to work with Scaffolding Extensions.
|
14
|
-
module ScaffoldingExtensions::MetaDataMapper
|
15
|
-
SCAFFOLD_OPTIONS = ::ScaffoldingExtensions::MetaModel::SCAFFOLD_OPTIONS
|
16
|
-
|
17
|
-
# Add the associated object to the object's association
|
18
|
-
def scaffold_add_associated_object(association, object, associated_object)
|
19
|
-
association_proxy = object.send(association)
|
20
|
-
next if association_proxy.include?(associated_object)
|
21
|
-
association_proxy << associated_object
|
22
|
-
object.save
|
23
|
-
end
|
24
|
-
|
25
|
-
# Array of all association reflections for this model
|
26
|
-
def scaffold_all_associations
|
27
|
-
database.schema[self].associations.to_a
|
28
|
-
end
|
29
|
-
|
30
|
-
# The class that this model is associated with via the association
|
31
|
-
def scaffold_associated_class(association)
|
32
|
-
case reflection = scaffold_association(association)
|
33
|
-
when DataMapper::Associations::HasManyAssociation
|
34
|
-
reflection.associated_constant
|
35
|
-
else
|
36
|
-
reflection.constant
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
# The association reflection for this association
|
41
|
-
def scaffold_association(association)
|
42
|
-
database.schema[self].associations.each{|assoc| return assoc if assoc.name == association}
|
43
|
-
nil
|
44
|
-
end
|
45
|
-
|
46
|
-
# The type of association, either :new for :has_many (as you can create new objects
|
47
|
-
# associated with the current object), :edit for :has_and_belongs_to_many (since you
|
48
|
-
# can edit the list of associated objects), or :one for other associations. I'm not
|
49
|
-
# sure that :has_one is supported, as I don't use it.
|
50
|
-
def scaffold_association_type(association)
|
51
|
-
case scaffold_association(association)
|
52
|
-
when DataMapper::Associations::HasManyAssociation
|
53
|
-
:new
|
54
|
-
when DataMapper::Associations::HasAndBelongsToManyAssociation
|
55
|
-
:edit
|
56
|
-
else
|
57
|
-
:one
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
# List of symbols for associations to display on the scaffolded edit page. Defaults to
|
62
|
-
# all associations that aren't :through or :polymorphic. Can be set with an instance variable.
|
63
|
-
def scaffold_associations
|
64
|
-
@scaffold_associations ||= scaffold_all_associations.collect{|assoc| assoc.name}.sort_by{|name| name.to_s}
|
65
|
-
end
|
66
|
-
|
67
|
-
# Destroys the object
|
68
|
-
def scaffold_destroy(object)
|
69
|
-
object.destroy!
|
70
|
-
end
|
71
|
-
|
72
|
-
# The error to raise, should match other errors raised by the underlying library.
|
73
|
-
# I'm not sure that this is the correct error, but it is the most common error I've
|
74
|
-
# received.
|
75
|
-
def scaffold_error_raised
|
76
|
-
::DataObject::ReaderClosed
|
77
|
-
end
|
78
|
-
|
79
|
-
# Returns the list of fields to display on the scaffolded forms. Defaults
|
80
|
-
# to displaying all columns with the exception of primary key column, timestamp columns,
|
81
|
-
# count columns, and inheritance columns. Also includes belongs_to associations, replacing
|
82
|
-
# the foriegn keys with the association itself. Can be set with an instance variable.
|
83
|
-
def scaffold_fields(action = :default)
|
84
|
-
return @scaffold_fields if @scaffold_fields
|
85
|
-
schema = database.schema[self]
|
86
|
-
key = schema.key.name
|
87
|
-
fields = schema.columns.to_a.collect{|x| x.name}.reject{|x| x == key}
|
88
|
-
schema.associations.each do |r|
|
89
|
-
next unless DataMapper::Associations::BelongsToAssociation === r
|
90
|
-
fields << r.name
|
91
|
-
fields.delete(r.foreign_key_name.to_sym)
|
92
|
-
end
|
93
|
-
@scaffold_fields = fields.sort_by{|x| x.to_s}
|
94
|
-
end
|
95
|
-
|
96
|
-
# The foreign key for the given reflection
|
97
|
-
def scaffold_foreign_key(reflection)
|
98
|
-
reflection.foreign_key_name
|
99
|
-
end
|
100
|
-
|
101
|
-
# Retrieve a single model object given an id
|
102
|
-
def scaffold_get_object(id)
|
103
|
-
self[id]
|
104
|
-
end
|
105
|
-
|
106
|
-
# Retrieve multiple objects given a hash of options
|
107
|
-
def scaffold_get_objects(options)
|
108
|
-
options[:conditions] = scaffold_merge_conditions(options[:conditions])
|
109
|
-
all(options)
|
110
|
-
end
|
111
|
-
|
112
|
-
# Return the class, left foreign key, right foreign key, and join table for this habtm association
|
113
|
-
def scaffold_habtm_reflection_options(association)
|
114
|
-
reflection = scaffold_association(association)
|
115
|
-
[reflection.constant, reflection.left_foreign_key, reflection.right_foreign_key, reflection.join_table]
|
116
|
-
end
|
117
|
-
|
118
|
-
# Returns a hash of values to be used as url parameters on the link to create a new
|
119
|
-
# :has_many associated object. Defaults to setting the foreign key field to the
|
120
|
-
# record's primary key.
|
121
|
-
def scaffold_new_associated_object_values(association, record)
|
122
|
-
{scaffold_foreign_key(scaffold_association(association))=>record.id}
|
123
|
-
end
|
124
|
-
|
125
|
-
# The primary key for the given table
|
126
|
-
def scaffold_primary_key
|
127
|
-
database.schema[self].key.name
|
128
|
-
end
|
129
|
-
|
130
|
-
# Saves the object.
|
131
|
-
def scaffold_save(action, object)
|
132
|
-
object.save rescue false
|
133
|
-
end
|
134
|
-
|
135
|
-
# The column type for the given table column, or nil if it isn't a table column
|
136
|
-
def scaffold_table_column_type(column)
|
137
|
-
column = database.schema[self][column]
|
138
|
-
column.type if column
|
139
|
-
end
|
140
|
-
|
141
|
-
# The name of the underlying table
|
142
|
-
def scaffold_table_name
|
143
|
-
database.schema[self].name
|
144
|
-
end
|
145
|
-
|
146
|
-
private
|
147
|
-
# Updates associated records for a given reflection and from record to point to the
|
148
|
-
# to record
|
149
|
-
def scaffold_reflection_merge(reflection, from, to)
|
150
|
-
sql = case reflection
|
151
|
-
when DataMapper::Associations::HasManyAssociation
|
152
|
-
foreign_key = scaffold_foreign_key(reflection)
|
153
|
-
"UPDATE #{reflection.associated_constant.scaffold_table_name} SET #{foreign_key} = #{to} WHERE #{foreign_key} = #{from}"
|
154
|
-
when DataMapper::Associations::HasAndBelongsToManyAssociation
|
155
|
-
foreign_key = reflection.left_foreign_key
|
156
|
-
"UPDATE #{reflection.join_table} SET #{foreign_key} = #{to} WHERE #{foreign_key} = #{from}"
|
157
|
-
else
|
158
|
-
return
|
159
|
-
end
|
160
|
-
database.execute(sql)
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
# Add the class methods and instance methods from Scaffolding Extensions
|
165
|
-
class DataMapper::Base
|
166
|
-
SCAFFOLD_OPTIONS = ::ScaffoldingExtensions::MetaModel::SCAFFOLD_OPTIONS
|
167
|
-
include ScaffoldingExtensions::Model
|
168
|
-
include ScaffoldingExtensions::ARDM
|
169
|
-
include ScaffoldingExtensions::DataMapper
|
170
|
-
extend ScaffoldingExtensions::MetaModel
|
171
|
-
extend ScaffoldingExtensions::MetaARDM
|
172
|
-
extend ScaffoldingExtensions::MetaDataMapper
|
173
|
-
extend ScaffoldingExtensions::Overridable
|
174
|
-
end
|