amrita2 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README +5 -5
- data/Rakefile +85 -0
- data/lib/amrita2/gettext.rb +9 -4
- data/lib/amrita2/template.rb +20 -9
- data/lib/amrita2/testsupport.rb +25 -0
- data/lib/amrita2/version.rb +1 -1
- data/sample/depot/README +160 -0
- data/sample/depot/Rakefile +10 -0
- data/sample/depot/app/views/admin/_form.html.a2 +23 -0
- data/sample/depot/app/views/admin/_form.html.erb +14 -0
- data/sample/depot/app/views/admin/edit.html.a2 +22 -0
- data/sample/depot/app/views/admin/edit.html.erb +10 -0
- data/sample/depot/app/views/admin/list.html.a2 +34 -0
- data/sample/depot/app/views/admin/list.html.erb +37 -0
- data/sample/depot/app/views/admin/new.html.a2 +21 -0
- data/sample/depot/app/views/admin/new.html.erb +9 -0
- data/sample/depot/app/views/admin/show.html.a2 +12 -0
- data/sample/depot/app/views/admin/show.html.erb +13 -0
- data/sample/depot/app/views/info/who_bought.rhtml +14 -0
- data/sample/depot/app/views/info/who_bought.rxml +8 -0
- data/sample/depot/app/views/layouts/admin.a2html +32 -0
- data/sample/depot/app/views/layouts/admin.rhtml +40 -0
- data/sample/depot/app/views/layouts/store.a2html +37 -0
- data/sample/depot/app/views/layouts/store.rhtml +43 -0
- data/sample/depot/app/views/login/add_user.rhtml +33 -0
- data/sample/depot/app/views/login/index.rhtml +9 -0
- data/sample/depot/app/views/login/list_users.rhtml +20 -0
- data/sample/depot/app/views/login/login.rhtml +26 -0
- data/sample/depot/app/views/store/_cart.html.a2 +18 -0
- data/sample/depot/app/views/store/_cart.html.erb +17 -0
- data/sample/depot/app/views/store/_cart_item.html.a2 +16 -0
- data/sample/depot/app/views/store/_cart_item.html.erb +14 -0
- data/sample/depot/app/views/store/add_to_cart.rjs +11 -0
- data/sample/depot/app/views/store/checkout.html.a2 +45 -0
- data/sample/depot/app/views/store/checkout.html.a2.using_macro +32 -0
- data/sample/depot/app/views/store/checkout.html.a2.without_label +37 -0
- data/sample/depot/app/views/store/checkout.html.erb +41 -0
- data/sample/depot/app/views/store/index.html.a2 +19 -0
- data/sample/depot/app/views/store/index.html.erb +22 -0
- data/sample/depot/config/database.yml +24 -0
- data/sample/depot/db/create_database.sql +14 -0
- data/sample/depot/doc/README_FOR_APP +35 -0
- data/sample/depot/lib/tasks/db_schema_version.rake +6 -0
- data/sample/depot/log/development.log +116 -0
- data/sample/depot/log/test.log +347 -0
- data/sample/depot/public/404.html +13 -0
- data/sample/depot/public/500.html +13 -0
- data/sample/depot/public/dispatch.cgi +10 -0
- data/sample/depot/public/dispatch.fcgi +24 -0
- data/sample/depot/public/favicon.ico +0 -0
- data/sample/depot/public/images/auto.jpg +0 -0
- data/sample/depot/public/images/logo.png +0 -0
- data/sample/depot/public/images/rails.png +0 -0
- data/sample/depot/public/images/svn.jpg +0 -0
- data/sample/depot/public/images/utc.jpg +0 -0
- data/sample/depot/public/index.html +282 -0
- data/sample/depot/public/javascripts/application.js +2 -0
- data/sample/depot/public/javascripts/controls.js +832 -0
- data/sample/depot/public/javascripts/dragdrop.js +942 -0
- data/sample/depot/public/javascripts/effects.js +954 -0
- data/sample/depot/public/javascripts/prototype.js +2347 -0
- data/sample/depot/public/robots.txt +1 -0
- data/sample/depot/public/stylesheets/depot.css +227 -0
- data/sample/depot/public/stylesheets/scaffold.css +74 -0
- data/sample/depot/script/about +3 -0
- data/sample/depot/script/breakpointer +3 -0
- data/sample/depot/script/console +3 -0
- data/sample/depot/script/destroy +3 -0
- data/sample/depot/script/generate +3 -0
- data/sample/depot/script/performance/benchmarker +3 -0
- data/sample/depot/script/performance/profiler +3 -0
- data/sample/depot/script/plugin +3 -0
- data/sample/depot/script/process/inspector +3 -0
- data/sample/depot/script/process/reaper +3 -0
- data/sample/depot/script/process/spawner +3 -0
- data/sample/depot/script/runner +3 -0
- data/sample/depot/script/server +3 -0
- data/sample/depot/test/fixtures/line_items.yml +16 -0
- data/sample/depot/test/fixtures/orders.yml +4 -0
- data/sample/depot/test/fixtures/performance/products.yml +8 -0
- data/sample/depot/test/fixtures/products.yml +16 -0
- data/sample/depot/test/fixtures/users.yml +7 -0
- data/sample/depot/vendor/plugins/will_paginate/LICENSE +18 -0
- data/sample/depot/vendor/plugins/will_paginate/README +171 -0
- data/sample/depot/vendor/plugins/will_paginate/Rakefile +27 -0
- data/sample/depot/vendor/plugins/will_paginate/test/console +9 -0
- data/sample/depot/vendor/plugins/will_paginate/test/fixtures/companies.yml +24 -0
- data/sample/depot/vendor/plugins/will_paginate/test/fixtures/developers_projects.yml +13 -0
- data/sample/depot/vendor/plugins/will_paginate/test/fixtures/projects.yml +7 -0
- data/sample/depot/vendor/plugins/will_paginate/test/fixtures/replies.yml +34 -0
- data/sample/depot/vendor/plugins/will_paginate/test/fixtures/schema.sql +44 -0
- data/sample/depot/vendor/plugins/will_paginate/test/fixtures/topics.yml +30 -0
- data/sample/depot/vendor/plugins/will_paginate/test/fixtures/users.yml +35 -0
- data/sample/login_engine/README +182 -0
- data/sample/login_engine/Rakefile +27 -0
- data/sample/login_engine/app/views/layouts/user.a2html +20 -0
- data/sample/login_engine/app/views/layouts/user.rhtml +16 -0
- data/sample/login_engine/app/views/user/_edit.a2html +16 -0
- data/sample/login_engine/app/views/user/_edit.rhtml +11 -0
- data/sample/login_engine/app/views/user/_password.a2html +18 -0
- data/sample/login_engine/app/views/user/_password.rhtml +9 -0
- data/sample/login_engine/app/views/user/change_password.a2html +17 -0
- data/sample/login_engine/app/views/user/change_password.rhtml +17 -0
- data/sample/login_engine/app/views/user/edit.a2html +22 -0
- data/sample/login_engine/app/views/user/edit.rhtml +23 -0
- data/sample/login_engine/app/views/user/forgot_password.rhtml +18 -0
- data/sample/login_engine/app/views/user/home.a2html +12 -0
- data/sample/login_engine/app/views/user/home.rhtml +7 -0
- data/sample/login_engine/app/views/user/login.a2html +16 -0
- data/sample/login_engine/app/views/user/login.rhtml +17 -0
- data/sample/login_engine/app/views/user/logout.rhtml +8 -0
- data/sample/login_engine/app/views/user/signup.a2html +14 -0
- data/sample/login_engine/app/views/user/signup.rhtml +17 -0
- data/sample/login_engine/app/views/user_notify/change_password.rhtml +10 -0
- data/sample/login_engine/app/views/user_notify/delete.rhtml +5 -0
- data/sample/login_engine/app/views/user_notify/forgot_password.rhtml +11 -0
- data/sample/login_engine/app/views/user_notify/pending_delete.rhtml +9 -0
- data/sample/login_engine/app/views/user_notify/signup.rhtml +12 -0
- data/sample/login_engine/config/database.yml +18 -0
- data/sample/login_engine/db/create_database.sql +14 -0
- data/sample/login_engine/db/dev.sqlite3 +0 -0
- data/sample/login_engine/db/test.sqlite3 +0 -0
- data/sample/login_engine/doc/README_FOR_APP +2 -0
- data/sample/login_engine/locale/ja/LC_MESSAGES/login_engine.mo +0 -0
- data/sample/login_engine/log/development.log +330 -0
- data/sample/login_engine/log/test.log +19026 -0
- data/sample/login_engine/po/ja/login_engine.po +248 -0
- data/sample/login_engine/po/login_engine.pot +245 -0
- data/sample/login_engine/public/404.html +30 -0
- data/sample/login_engine/public/500.html +30 -0
- data/sample/login_engine/public/dispatch.cgi +10 -0
- data/sample/login_engine/public/dispatch.fcgi +24 -0
- data/sample/login_engine/public/favicon.ico +0 -0
- data/sample/login_engine/public/images/rails.png +0 -0
- data/sample/login_engine/public/index.html +277 -0
- data/sample/login_engine/public/javascripts/application.js +2 -0
- data/sample/login_engine/public/javascripts/controls.js +833 -0
- data/sample/login_engine/public/javascripts/dragdrop.js +942 -0
- data/sample/login_engine/public/javascripts/effects.js +1088 -0
- data/sample/login_engine/public/javascripts/prototype.js +2385 -0
- data/sample/login_engine/public/robots.txt +1 -0
- data/sample/login_engine/public/stylesheets/login_engine.css +81 -0
- data/sample/login_engine/script/about +3 -0
- data/sample/login_engine/script/breakpointer +3 -0
- data/sample/login_engine/script/console +3 -0
- data/sample/login_engine/script/destroy +3 -0
- data/sample/login_engine/script/generate +3 -0
- data/sample/login_engine/script/performance/benchmarker +3 -0
- data/sample/login_engine/script/performance/profiler +3 -0
- data/sample/login_engine/script/plugin +3 -0
- data/sample/login_engine/script/process/inspector +3 -0
- data/sample/login_engine/script/process/reaper +3 -0
- data/sample/login_engine/script/process/spawner +3 -0
- data/sample/login_engine/script/runner +3 -0
- data/sample/login_engine/script/server +3 -0
- data/sample/login_engine/test/fixtures/users.yml +41 -0
- data/specs/erb_cdata.rb +11 -0
- data/specs/filters.rb +5 -4
- data/specs/gettext/static_text.rb +30 -13
- data/specs/impl/preprocess.rb +58 -54
- metadata +375 -120
- data/sample/hello/test1.rb +0 -23
data/README
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
== Summary
|
4
4
|
|
5
|
-
Amrita2 is a a xml/xhtml template library for Ruby.
|
5
|
+
Amrita2 is a a xml/xhtml template library for Ruby.
|
6
6
|
It makes html documents from a template and a model data.
|
7
7
|
|
8
8
|
=== Key feature
|
@@ -22,7 +22,7 @@ It makes html documents from a template and a model data.
|
|
22
22
|
</html>
|
23
23
|
END
|
24
24
|
|
25
|
-
data = {
|
25
|
+
data = {
|
26
26
|
:page_title=>'Amrita2',
|
27
27
|
:header_title=>'Hello, Amrita2',
|
28
28
|
:text=>{
|
@@ -37,7 +37,7 @@ It makes html documents from a template and a model data.
|
|
37
37
|
</head>
|
38
38
|
<body>
|
39
39
|
<h1>Hello, Amrita2</h1>
|
40
|
-
<p class="text">Amrita2 is a html template library for Ruby</p>
|
40
|
+
<p class="text">Amrita2 is a html template library for Ruby</p>
|
41
41
|
</body>
|
42
42
|
</html>
|
43
43
|
END
|
@@ -77,7 +77,7 @@ matching the +id+ attribute of XML element to model data.
|
|
77
77
|
|
78
78
|
=== Current version and roadmap
|
79
79
|
|
80
|
-
Current version is 2.0.
|
80
|
+
Current version is 2.0.2 .
|
81
81
|
|
82
82
|
=== Setup
|
83
83
|
|
@@ -102,7 +102,7 @@ Amrita2 is Copyright (c) 2008 Taku Nakajima
|
|
102
102
|
redistributed under the terms specified in the README file of the Ruby
|
103
103
|
distribution.
|
104
104
|
|
105
|
-
Sample source code under sample/depot is Amrita2 version of
|
105
|
+
Sample source code under sample/depot is Amrita2 version of
|
106
106
|
Depot Application of "Agile Web Development with Rails".
|
107
107
|
|
108
108
|
http://www.pragprog.com/titles/rails2/source_code
|
data/Rakefile
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rake/rdoctask'
|
5
|
+
require 'spec/rake/spectask'
|
6
|
+
require 'lib/amrita2/version'
|
7
|
+
|
8
|
+
Gem.manage_gems
|
9
|
+
|
10
|
+
TMP='/tmp'
|
11
|
+
PACKAGE_NAME = "amrita2"
|
12
|
+
PACKAGE_VERSION = Amrita2::Version::STRING
|
13
|
+
package_name = "#{PACKAGE_NAME}-#{PACKAGE_VERSION}"
|
14
|
+
package_dir = "pkg"
|
15
|
+
package_dir_path = "#{package_dir}/#{package_name}"
|
16
|
+
|
17
|
+
tar_file = "#{package_name}.tar.gz"
|
18
|
+
gem_file = "#{package_name}.gem"
|
19
|
+
|
20
|
+
ENV['RUBYLIB'] = "lib"
|
21
|
+
|
22
|
+
task :default => [ :specs, :test_login_engine, :spec1 ]
|
23
|
+
task :test => [ :specs ]
|
24
|
+
|
25
|
+
desc "Run all specs"
|
26
|
+
Spec::Rake::SpecTask.new('specs') do |t|
|
27
|
+
t.spec_files = FileList['specs/**/*.rb']
|
28
|
+
t.spec_opts = %w(-Du)
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "Run all specs one by one"
|
32
|
+
task :spec1 do
|
33
|
+
tmp = "/tmp/amrita_spec.out"
|
34
|
+
Dir['specs/**/*.rb'].each do |f|
|
35
|
+
begin
|
36
|
+
sh %{spec #{f} > #{tmp} }
|
37
|
+
sh %{spec -r amrita2/gettext #{f} > #{tmp} }
|
38
|
+
rescue
|
39
|
+
puts File::open(tmp).read
|
40
|
+
raise
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
task :clean do
|
46
|
+
Dir['**/*~'].each do |f|
|
47
|
+
puts f
|
48
|
+
FileUtils::rm_f f
|
49
|
+
end
|
50
|
+
|
51
|
+
Dir['docs'].each do |f|
|
52
|
+
puts f
|
53
|
+
FileUtils::rm_rf f
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
task :test_login_engine do
|
58
|
+
Dir::chdir("sample/login_engine") do
|
59
|
+
Dir::mkdir "log" unless FileTest::directory?("log")
|
60
|
+
sh %{rake test}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
desc "Generate documentation for the application"
|
65
|
+
Rake::RDocTask.new("appdoc") { |rdoc|
|
66
|
+
rdoc.rdoc_dir = 'docs/app'
|
67
|
+
rdoc.title = "Amrita2 Documentation"
|
68
|
+
rdoc.rdoc_files = Dir['lib/amrita2/*.rb']
|
69
|
+
rdoc.rdoc_files << 'README'
|
70
|
+
}
|
71
|
+
|
72
|
+
task :tar do
|
73
|
+
Dir::chdir(TMP) do
|
74
|
+
system 'rm -rf amrita2'
|
75
|
+
system "svn export http://svn.brain-tokyo.net/amrita2/trunk/amrita2 #{package_name}"
|
76
|
+
system "tar zcvf #{tar_file} #{package_name}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
task :gem => :clean do
|
81
|
+
spec = eval(File.read("amrita2.gemspec"))
|
82
|
+
Gem::Builder.new(spec).build
|
83
|
+
mv gem_file, "#{TMP}/#{gem_file}"
|
84
|
+
end
|
85
|
+
|
data/lib/amrita2/gettext.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'amrita2/template'
|
2
2
|
require 'gettext/rgettext'
|
3
3
|
|
4
|
-
module Amrita2
|
4
|
+
module Amrita2
|
5
5
|
module Core
|
6
6
|
class CompoundElement # :nodoc: all
|
7
7
|
def get_erb_source
|
@@ -25,6 +25,11 @@ module Amrita2
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
class CommentNode # :nodoc: all
|
29
|
+
def get_erb_source
|
30
|
+
""
|
31
|
+
end
|
32
|
+
end
|
28
33
|
|
29
34
|
class RootElement < DynamicElement # :nodoc: all
|
30
35
|
attr_accessor :text_domain
|
@@ -55,10 +60,10 @@ module Amrita2
|
|
55
60
|
def dynamic?
|
56
61
|
true
|
57
62
|
end
|
58
|
-
|
63
|
+
|
59
64
|
def render_me(cg)
|
60
65
|
#text = @node.to_s.strip
|
61
|
-
|
66
|
+
|
62
67
|
# to keep
|
63
68
|
text = ""
|
64
69
|
@node.output(text, :preserve=>true)
|
@@ -92,7 +97,7 @@ module Amrita2
|
|
92
97
|
|
93
98
|
module_function
|
94
99
|
def target?(file)
|
95
|
-
File.extname(file) == '.a2html'
|
100
|
+
File.extname(file) == '.a2html' || File.extname(file) == '.a2'
|
96
101
|
end
|
97
102
|
|
98
103
|
def parse(file, ary)
|
data/lib/amrita2/template.rb
CHANGED
@@ -2,7 +2,7 @@ require 'hpricot'
|
|
2
2
|
require 'erb'
|
3
3
|
require 'enumerator'
|
4
4
|
|
5
|
-
module Amrita2
|
5
|
+
module Amrita2
|
6
6
|
module ScalarData
|
7
7
|
def amrita_value
|
8
8
|
Amrita2::Util::sanitize_text(to_s)
|
@@ -394,7 +394,7 @@ module Amrita2
|
|
394
394
|
end
|
395
395
|
end
|
396
396
|
|
397
|
-
module Core
|
397
|
+
module Core
|
398
398
|
class CodeGenerator # :nodoc: all
|
399
399
|
def initialize
|
400
400
|
@iehack = true
|
@@ -1165,8 +1165,8 @@ module Amrita2
|
|
1165
1165
|
#
|
1166
1166
|
# tmpl = Template.new "...."
|
1167
1167
|
# tmpl.set_trace(STDOUT)
|
1168
|
-
# puts tmpl.render_with(...)
|
1169
|
-
|
1168
|
+
# puts tmpl.render_with(...)
|
1169
|
+
|
1170
1170
|
def set_trace(io_or_type, &block)
|
1171
1171
|
@tracer = Tracer.new(io_or_type, &block)
|
1172
1172
|
end
|
@@ -1554,7 +1554,8 @@ module Amrita2
|
|
1554
1554
|
S_COND = %q[\\?(\\!)?\\[(.+)\\]]
|
1555
1555
|
S_VALUE = %q[\\{(.+)\\}]
|
1556
1556
|
S_TRAILER = %q[((?: |\\-)*)]
|
1557
|
-
|
1557
|
+
S_ERB_IN_AMXML = %q[%=(.*)]
|
1558
|
+
S_AMVARS = %[(#{S_FOR}|#{S_COND}|#{S_VALUE}|#{S_ERB_IN_AMXML})?]
|
1558
1559
|
R_AMXML_WITHOUT_TAG = %r[\A\s*(?:\/)?\s*(?:#{S_NO_SRC}|#{S_SRC_AND_FILTERS})*\s*#{S_AMVARS}\s*\Z]um
|
1559
1560
|
R_AMXML = %r[\A#{R_TAG_ATTR}\s*(?:\/)?\s*(?:#{S_NO_SRC}|#{S_SRC_AND_FILTERS})*\s*#{S_AMVARS}\s*\Z]um
|
1560
1561
|
R_AMXML_BLOCK_LINE = %r[^\s*<<\s*?(.*)\s*?<#{S_TRAILER}$]
|
@@ -1648,6 +1649,8 @@ module Amrita2
|
|
1648
1649
|
end
|
1649
1650
|
when %r[#{S_VALUE}]m
|
1650
1651
|
@value = $1.strip
|
1652
|
+
when %r[#{S_ERB_IN_AMXML}]m
|
1653
|
+
@erb = $1.strip
|
1651
1654
|
else
|
1652
1655
|
raise "can't happen #{s}"
|
1653
1656
|
end
|
@@ -1702,7 +1705,7 @@ module Amrita2
|
|
1702
1705
|
ret << make_attr(am_skipif, @skipif)
|
1703
1706
|
end
|
1704
1707
|
if @skipunless
|
1705
|
-
am_skipif = @opt[:
|
1708
|
+
am_skipif = @opt[:am_skipunless] || "am:skipif"
|
1706
1709
|
ret << make_attr(am_skipif, "not(#@skipunless)")
|
1707
1710
|
end
|
1708
1711
|
if @value
|
@@ -1710,10 +1713,18 @@ module Amrita2
|
|
1710
1713
|
ret << make_attr(am_v, "HashDelegator.new($_) { {#@value} }")
|
1711
1714
|
end
|
1712
1715
|
ret << @attr.to_s
|
1713
|
-
if
|
1714
|
-
|
1716
|
+
if @erb
|
1717
|
+
if single_tag
|
1718
|
+
ret << "><![CDATA[<%= #{@erb} %>]]></#@tag>"
|
1719
|
+
else
|
1720
|
+
raise "not implemented"
|
1721
|
+
end
|
1715
1722
|
else
|
1716
|
-
|
1723
|
+
if single_tag
|
1724
|
+
ret << " />"
|
1725
|
+
else
|
1726
|
+
ret << " >"
|
1727
|
+
end
|
1717
1728
|
end
|
1718
1729
|
ret
|
1719
1730
|
end
|
data/lib/amrita2/testsupport.rb
CHANGED
@@ -144,3 +144,28 @@ end
|
|
144
144
|
class Object
|
145
145
|
include Amrita2::TestSupport
|
146
146
|
end
|
147
|
+
|
148
|
+
if Object::const_defined?(:ActionView)
|
149
|
+
|
150
|
+
class ActionView::Base # :nodoc: all
|
151
|
+
def self.unregister_template_handler(extension)
|
152
|
+
self.cache_template_extensions = false
|
153
|
+
@@template_handlers.delete(extension)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
module Amrita2
|
158
|
+
module RailsTestHelper # :nodoc: all
|
159
|
+
def compare_result
|
160
|
+
ActionView::Base.register_template_handler "a2html", Amrita2View::Base
|
161
|
+
amrita2_result = yield
|
162
|
+
ActionView::Base.unregister_template_handler "a2html"
|
163
|
+
erb_result = yield
|
164
|
+
assert_equal_as_xml(erb_result, amrita2_result)
|
165
|
+
#assert_dom_equal(amrita2_result, erb_result)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
|
data/lib/amrita2/version.rb
CHANGED
data/sample/depot/README
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
== Welcome to Rails
|
2
|
+
|
3
|
+
Rails is a web-application and persistence framework that includes everything
|
4
|
+
needed to create database-backed web-applications according to the
|
5
|
+
Model-View-Control pattern of separation. This pattern splits the view (also
|
6
|
+
called the presentation) into "dumb" templates that are primarily responsible
|
7
|
+
for inserting pre-built data in between HTML tags. The model contains the
|
8
|
+
"smart" domain objects (such as Account, Product, Person, Post) that holds all
|
9
|
+
the business logic and knows how to persist themselves to a database. The
|
10
|
+
controller handles the incoming requests (such as Save New Account, Update
|
11
|
+
Product, Show Post) by manipulating the model and directing data to the view.
|
12
|
+
|
13
|
+
In Rails, the model is handled by what's called an object-relational mapping
|
14
|
+
layer entitled Active Record. This layer allows you to present the data from
|
15
|
+
database rows as objects and embellish these data objects with business logic
|
16
|
+
methods. You can read more about Active Record in
|
17
|
+
link:files/vendor/rails/activerecord/README.html.
|
18
|
+
|
19
|
+
The controller and view are handled by the Action Pack, which handles both
|
20
|
+
layers by its two parts: Action View and Action Controller. These two layers
|
21
|
+
are bundled in a single package due to their heavy interdependence. This is
|
22
|
+
unlike the relationship between the Active Record and Action Pack that is much
|
23
|
+
more separate. Each of these packages can be used independently outside of
|
24
|
+
Rails. You can read more about Action Pack in
|
25
|
+
link:files/vendor/rails/actionpack/README.html.
|
26
|
+
|
27
|
+
|
28
|
+
== Getting started
|
29
|
+
|
30
|
+
1. Run the WEBrick servlet: <tt>ruby script/server</tt> (run with --help for options)
|
31
|
+
...or if you have lighttpd installed: <tt>ruby script/lighttpd</tt> (it's faster)
|
32
|
+
2. Go to http://localhost:3000/ and get "Congratulations, you've put Ruby on Rails!"
|
33
|
+
3. Follow the guidelines on the "Congratulations, you've put Ruby on Rails!" screen
|
34
|
+
|
35
|
+
|
36
|
+
== Example for Apache conf
|
37
|
+
|
38
|
+
<VirtualHost *:80>
|
39
|
+
ServerName rails
|
40
|
+
DocumentRoot /path/application/public/
|
41
|
+
ErrorLog /path/application/log/server.log
|
42
|
+
|
43
|
+
<Directory /path/application/public/>
|
44
|
+
Options ExecCGI FollowSymLinks
|
45
|
+
AllowOverride all
|
46
|
+
Allow from all
|
47
|
+
Order allow,deny
|
48
|
+
</Directory>
|
49
|
+
</VirtualHost>
|
50
|
+
|
51
|
+
NOTE: Be sure that CGIs can be executed in that directory as well. So ExecCGI
|
52
|
+
should be on and ".cgi" should respond. All requests from 127.0.0.1 go
|
53
|
+
through CGI, so no Apache restart is necessary for changes. All other requests
|
54
|
+
go through FCGI (or mod_ruby), which requires a restart to show changes.
|
55
|
+
|
56
|
+
|
57
|
+
== Debugging Rails
|
58
|
+
|
59
|
+
Have "tail -f" commands running on both the server.log, production.log, and
|
60
|
+
test.log files. Rails will automatically display debugging and runtime
|
61
|
+
information to these files. Debugging info will also be shown in the browser
|
62
|
+
on requests from 127.0.0.1.
|
63
|
+
|
64
|
+
|
65
|
+
== Breakpoints
|
66
|
+
|
67
|
+
Breakpoint support is available through the script/breakpointer client. This
|
68
|
+
means that you can break out of execution at any point in the code, investigate
|
69
|
+
and change the model, AND then resume execution! Example:
|
70
|
+
|
71
|
+
class WeblogController < ActionController::Base
|
72
|
+
def index
|
73
|
+
@posts = Post.find_all
|
74
|
+
breakpoint "Breaking out from the list"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
So the controller will accept the action, run the first line, then present you
|
79
|
+
with a IRB prompt in the breakpointer window. Here you can do things like:
|
80
|
+
|
81
|
+
Executing breakpoint "Breaking out from the list" at .../webrick_server.rb:16 in 'breakpoint'
|
82
|
+
|
83
|
+
>> @posts.inspect
|
84
|
+
=> "[#<Post:0x14a6be8 @attributes={\"title\"=>nil, \"body\"=>nil, \"id\"=>\"1\"}>,
|
85
|
+
#<Post:0x14a6620 @attributes={\"title\"=>\"Rails you know!\", \"body\"=>\"Only ten..\", \"id\"=>\"2\"}>]"
|
86
|
+
>> @posts.first.title = "hello from a breakpoint"
|
87
|
+
=> "hello from a breakpoint"
|
88
|
+
|
89
|
+
...and even better is that you can examine how your runtime objects actually work:
|
90
|
+
|
91
|
+
>> f = @posts.first
|
92
|
+
=> #<Post:0x13630c4 @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>
|
93
|
+
>> f.
|
94
|
+
Display all 152 possibilities? (y or n)
|
95
|
+
|
96
|
+
Finally, when you're ready to resume execution, you press CTRL-D
|
97
|
+
|
98
|
+
|
99
|
+
== Console
|
100
|
+
|
101
|
+
You can interact with the domain model by starting the console through script/console.
|
102
|
+
Here you'll have all parts of the application configured, just like it is when the
|
103
|
+
application is running. You can inspect domain models, change values, and save to the
|
104
|
+
database. Starting the script without arguments will launch it in the development environment.
|
105
|
+
Passing an argument will specify a different environment, like <tt>console production</tt>.
|
106
|
+
|
107
|
+
|
108
|
+
== Description of contents
|
109
|
+
|
110
|
+
app
|
111
|
+
Holds all the code that's specific to this particular application.
|
112
|
+
|
113
|
+
app/controllers
|
114
|
+
Holds controllers that should be named like weblog_controller.rb for
|
115
|
+
automated URL mapping. All controllers should descend from
|
116
|
+
ActionController::Base.
|
117
|
+
|
118
|
+
app/models
|
119
|
+
Holds models that should be named like post.rb.
|
120
|
+
Most models will descend from ActiveRecord::Base.
|
121
|
+
|
122
|
+
app/views
|
123
|
+
Holds the template files for the view that should be named like
|
124
|
+
weblog/index.rhtml for the WeblogController#index action. All views use eRuby
|
125
|
+
syntax. This directory can also be used to keep stylesheets, images, and so on
|
126
|
+
that can be symlinked to public.
|
127
|
+
|
128
|
+
app/helpers
|
129
|
+
Holds view helpers that should be named like weblog_helper.rb.
|
130
|
+
|
131
|
+
app/apis
|
132
|
+
Holds API classes for web services.
|
133
|
+
|
134
|
+
config
|
135
|
+
Configuration files for the Rails environment, the routing map, the database, and other dependencies.
|
136
|
+
|
137
|
+
components
|
138
|
+
Self-contained mini-applications that can bundle together controllers, models, and views.
|
139
|
+
|
140
|
+
db
|
141
|
+
Contains the SQL dump of your development database. db/migrate contains all
|
142
|
+
the sequence of Migrations for your schema.
|
143
|
+
|
144
|
+
lib
|
145
|
+
Application specific libraries. Basically, any kind of custom code that doesn't
|
146
|
+
belong under controllers, models, or helpers. This directory is in the load path.
|
147
|
+
|
148
|
+
public
|
149
|
+
The directory available for the web server. Contains subdirectories for images, stylesheets,
|
150
|
+
and javascripts. Also contains the dispatchers and the default HTML files.
|
151
|
+
|
152
|
+
script
|
153
|
+
Helper scripts for automation and generation.
|
154
|
+
|
155
|
+
test
|
156
|
+
Unit and functional tests along with fixtures.
|
157
|
+
|
158
|
+
vendor
|
159
|
+
External libraries that the application depends on. Also includes the plugins subdirectory.
|
160
|
+
This directory is in the load path.
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
2
|
+
# for example lib/tasks/switchtower.rake, and they will automatically be available to Rake.
|
3
|
+
|
4
|
+
require(File.join(File.dirname(__FILE__), 'config', 'boot'))
|
5
|
+
|
6
|
+
require 'rake'
|
7
|
+
require 'rake/testtask'
|
8
|
+
require 'rake/rdoctask'
|
9
|
+
|
10
|
+
require 'tasks/rails'
|