rails 2.3.2 → 2.3.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rails might be problematic. Click here for more details.

Files changed (118) hide show
  1. data/CHANGELOG +4 -0
  2. data/Rakefile +11 -9
  3. data/configs/routes.rb +1 -1
  4. data/guides/files/javascripts/code_highlighter.js +188 -0
  5. data/guides/files/javascripts/guides.js +8 -0
  6. data/guides/files/javascripts/highlighters.js +90 -0
  7. data/guides/files/stylesheets/main.css +441 -0
  8. data/guides/files/stylesheets/print.css +52 -0
  9. data/guides/files/stylesheets/reset.css +43 -0
  10. data/guides/files/stylesheets/style.css +13 -0
  11. data/guides/files/stylesheets/syntax.css +31 -0
  12. data/guides/images/belongs_to.png +0 -0
  13. data/guides/images/book_icon.gif +0 -0
  14. data/guides/images/bullet.gif +0 -0
  15. data/guides/images/chapters_icon.gif +0 -0
  16. data/guides/images/check_bullet.gif +0 -0
  17. data/guides/images/credits_pic_blank.gif +0 -0
  18. data/guides/images/csrf.png +0 -0
  19. data/guides/images/customized_error_messages.png +0 -0
  20. data/guides/images/error_messages.png +0 -0
  21. data/guides/images/feature_tile.gif +0 -0
  22. data/guides/images/footer_tile.gif +0 -0
  23. data/guides/images/fxn.jpg +0 -0
  24. data/guides/images/grey_bullet.gif +0 -0
  25. data/guides/images/habtm.png +0 -0
  26. data/guides/images/has_many.png +0 -0
  27. data/guides/images/has_many_through.png +0 -0
  28. data/guides/images/has_one.png +0 -0
  29. data/guides/images/has_one_through.png +0 -0
  30. data/guides/images/header_backdrop.png +0 -0
  31. data/guides/images/header_tile.gif +0 -0
  32. data/guides/images/i18n/demo_localized_pirate.png +0 -0
  33. data/guides/images/i18n/demo_translated_en.png +0 -0
  34. data/guides/images/i18n/demo_translated_pirate.png +0 -0
  35. data/guides/images/i18n/demo_translation_missing.png +0 -0
  36. data/guides/images/i18n/demo_untranslated.png +0 -0
  37. data/guides/images/icons/README +5 -0
  38. data/guides/images/icons/callouts/1.png +0 -0
  39. data/guides/images/icons/callouts/10.png +0 -0
  40. data/guides/images/icons/callouts/11.png +0 -0
  41. data/guides/images/icons/callouts/12.png +0 -0
  42. data/guides/images/icons/callouts/13.png +0 -0
  43. data/guides/images/icons/callouts/14.png +0 -0
  44. data/guides/images/icons/callouts/15.png +0 -0
  45. data/guides/images/icons/callouts/2.png +0 -0
  46. data/guides/images/icons/callouts/3.png +0 -0
  47. data/guides/images/icons/callouts/4.png +0 -0
  48. data/guides/images/icons/callouts/5.png +0 -0
  49. data/guides/images/icons/callouts/6.png +0 -0
  50. data/guides/images/icons/callouts/7.png +0 -0
  51. data/guides/images/icons/callouts/8.png +0 -0
  52. data/guides/images/icons/callouts/9.png +0 -0
  53. data/guides/images/icons/caution.png +0 -0
  54. data/guides/images/icons/example.png +0 -0
  55. data/guides/images/icons/home.png +0 -0
  56. data/guides/images/icons/important.png +0 -0
  57. data/guides/images/icons/next.png +0 -0
  58. data/guides/images/icons/note.png +0 -0
  59. data/guides/images/icons/prev.png +0 -0
  60. data/guides/images/icons/tip.png +0 -0
  61. data/guides/images/icons/up.png +0 -0
  62. data/guides/images/icons/warning.png +0 -0
  63. data/guides/images/nav_arrow.gif +0 -0
  64. data/guides/images/polymorphic.png +0 -0
  65. data/guides/images/posts_index.png +0 -0
  66. data/guides/images/rails_guides_logo.gif +0 -0
  67. data/guides/images/rails_logo_remix.gif +0 -0
  68. data/guides/images/rails_welcome.png +0 -0
  69. data/guides/images/session_fixation.png +0 -0
  70. data/guides/images/tab_grey.gif +0 -0
  71. data/guides/images/tab_info.gif +0 -0
  72. data/guides/images/tab_note.gif +0 -0
  73. data/guides/images/tab_red.gif +0 -0
  74. data/guides/images/tab_yellow.gif +0 -0
  75. data/guides/images/tab_yellow.png +0 -0
  76. data/guides/images/validation_error_messages.png +0 -0
  77. data/guides/rails_guides.rb +42 -0
  78. data/guides/rails_guides/generator.rb +138 -0
  79. data/guides/rails_guides/helpers.rb +34 -0
  80. data/guides/rails_guides/indexer.rb +55 -0
  81. data/guides/rails_guides/textile_extensions.rb +41 -0
  82. data/guides/source/2_2_release_notes.textile +422 -0
  83. data/guides/source/2_3_release_notes.textile +610 -0
  84. data/guides/source/action_controller_overview.textile +776 -0
  85. data/guides/source/action_mailer_basics.textile +424 -0
  86. data/guides/source/active_record_basics.textile +135 -0
  87. data/guides/source/active_record_querying.textile +969 -0
  88. data/guides/source/activerecord_validations_callbacks.textile +1086 -0
  89. data/guides/source/association_basics.textile +1781 -0
  90. data/guides/source/caching_with_rails.textile +524 -0
  91. data/guides/source/command_line.textile +589 -0
  92. data/guides/source/configuring.textile +234 -0
  93. data/guides/source/contribute.textile +71 -0
  94. data/guides/source/contributing_to_rails.textile +239 -0
  95. data/guides/source/credits.erb.textile +52 -0
  96. data/guides/source/debugging_rails_applications.textile +709 -0
  97. data/guides/source/form_helpers.textile +766 -0
  98. data/guides/source/getting_started.textile +1297 -0
  99. data/guides/source/i18n.textile +912 -0
  100. data/guides/source/index.erb.textile +124 -0
  101. data/guides/source/layout.html.erb +103 -0
  102. data/guides/source/layouts_and_rendering.textile +979 -0
  103. data/guides/source/migrations.textile +591 -0
  104. data/guides/source/nested_model_forms.textile +222 -0
  105. data/guides/source/performance_testing.textile +531 -0
  106. data/guides/source/plugins.textile +1512 -0
  107. data/guides/source/rails_on_rack.textile +309 -0
  108. data/guides/source/routing.textile +903 -0
  109. data/guides/source/security.textile +986 -0
  110. data/guides/source/testing.textile +951 -0
  111. data/lib/commands/performance/profiler.rb +1 -1
  112. data/lib/initializer.rb +27 -4
  113. data/lib/rails/gem_dependency.rb +35 -6
  114. data/lib/rails/rack/metal.rb +1 -1
  115. data/lib/rails/version.rb +1 -1
  116. data/lib/tasks/gems.rake +19 -6
  117. data/lib/test_help.rb +4 -1
  118. metadata +123 -7
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ *2.3.3 (July 12 2009)
2
+
3
+ * Version bump
4
+
1
5
  *2.3.2 [Final] (March 15, 2009)*
2
6
 
3
7
  * Allow metal to live in plugins #2045 [Matthew Rudy]
data/Rakefile CHANGED
@@ -2,7 +2,6 @@ require 'rake'
2
2
  require 'rake/testtask'
3
3
  require 'rake/rdoctask'
4
4
  require 'rake/gempackagetask'
5
- require 'rake/contrib/rubyforgepublisher'
6
5
 
7
6
  require 'date'
8
7
  require 'rbconfig'
@@ -246,7 +245,7 @@ def copy_with_rewritten_ruby_path(src_file, dest_file)
246
245
  end
247
246
 
248
247
  desc 'Generate guides (for authors), use ONLY=foo to process just "foo.textile"'
249
- task :guides do
248
+ task :generate_guides do
250
249
  ruby "guides/rails_guides.rb"
251
250
  end
252
251
 
@@ -294,6 +293,7 @@ PKG_FILES = FileList[
294
293
  'doc/**/*',
295
294
  'dispatches/**/*',
296
295
  'environments/**/*',
296
+ 'guides/**/*',
297
297
  'helpers/**/*',
298
298
  'generators/**/*',
299
299
  'html/**/*',
@@ -311,16 +311,16 @@ spec = Gem::Specification.new do |s|
311
311
  EOF
312
312
 
313
313
  s.add_dependency('rake', '>= 0.8.3')
314
- s.add_dependency('activesupport', '= 2.3.2' + PKG_BUILD)
315
- s.add_dependency('activerecord', '= 2.3.2' + PKG_BUILD)
316
- s.add_dependency('actionpack', '= 2.3.2' + PKG_BUILD)
317
- s.add_dependency('actionmailer', '= 2.3.2' + PKG_BUILD)
318
- s.add_dependency('activeresource', '= 2.3.2' + PKG_BUILD)
314
+ s.add_dependency('activesupport', '= 2.3.3' + PKG_BUILD)
315
+ s.add_dependency('activerecord', '= 2.3.3' + PKG_BUILD)
316
+ s.add_dependency('actionpack', '= 2.3.3' + PKG_BUILD)
317
+ s.add_dependency('actionmailer', '= 2.3.3' + PKG_BUILD)
318
+ s.add_dependency('activeresource', '= 2.3.3' + PKG_BUILD)
319
319
 
320
320
  s.rdoc_options << '--exclude' << '.'
321
321
  s.has_rdoc = false
322
322
 
323
- s.files = PKG_FILES.to_a.delete_if {|f| f.include?('.svn')}
323
+ s.files = PKG_FILES.to_a.delete_if {|f| f =~ %r{\.svn|guides/output}}
324
324
  s.require_path = 'lib'
325
325
  s.bindir = "bin" # Use these for applications.
326
326
  s.executables = ["rails"]
@@ -340,12 +340,13 @@ end
340
340
  # Publishing -------------------------------------------------------
341
341
  desc "Publish the rails gem"
342
342
  task :pgem => [:gem] do
343
+ require 'rake/contrib/sshpublisher'
343
344
  Rake::SshFilePublisher.new("gems.rubyonrails.org", "/u/sites/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
344
345
  `ssh gems.rubyonrails.org '/u/sites/gems/gemupdate.sh'`
345
346
  end
346
347
 
347
348
  desc "Publish the guides"
348
- task :pguides => :guides do
349
+ task :pguides => :generate_guides do
349
350
  mkdir_p 'pkg'
350
351
  `tar -czf pkg/guides.gz guides/output`
351
352
  Rake::SshFilePublisher.new("web.rubyonrails.org", "/u/sites/guides.rubyonrails.org/public", "pkg", "guides.gz").upload
@@ -354,6 +355,7 @@ end
354
355
 
355
356
  desc "Publish the release files to RubyForge."
356
357
  task :release => [ :package ] do
358
+ require 'rake/contrib/rubyforgepublisher'
357
359
  require 'rubyforge'
358
360
 
359
361
  packages = %w( gem ).collect{ |ext| "pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}" }
@@ -37,7 +37,7 @@ ActionController::Routing::Routes.draw do |map|
37
37
 
38
38
  # Install the default routes as the lowest priority.
39
39
  # Note: These default routes make all actions in every controller accessible via GET requests. You should
40
- # consider removing the them or commenting them out if you're using named routes and resources.
40
+ # consider removing or commenting them out if you're using named routes and resources.
41
41
  map.connect ':controller/:action/:id'
42
42
  map.connect ':controller/:action/:id.:format'
43
43
  end
@@ -0,0 +1,188 @@
1
+ /* Unobtrustive Code Highlighter By Dan Webb 11/2005
2
+ Version: 0.4
3
+
4
+ Usage:
5
+ Add a script tag for this script and any stylesets you need to use
6
+ to the page in question, add correct class names to CODE elements,
7
+ define CSS styles for elements. That's it!
8
+
9
+ Known to work on:
10
+ IE 5.5+ PC
11
+ Firefox/Mozilla PC/Mac
12
+ Opera 7.23 + PC
13
+ Safari 2
14
+
15
+ Known to degrade gracefully on:
16
+ IE5.0 PC
17
+
18
+ Note: IE5.0 fails due to the use of lookahead in some stylesets. To avoid script errors
19
+ in older browsers use expressions that use lookahead in string format when defining stylesets.
20
+
21
+ This script is inspired by star-light by entirely cunning Dean Edwards
22
+ http://dean.edwards.name/star-light/.
23
+ */
24
+
25
+ // replace callback support for safari.
26
+ if ("a".replace(/a/, function() {return "b"}) != "b") (function(){
27
+ var default_replace = String.prototype.replace;
28
+ String.prototype.replace = function(search,replace){
29
+ // replace is not function
30
+ if(typeof replace != "function"){
31
+ return default_replace.apply(this,arguments)
32
+ }
33
+ var str = "" + this;
34
+ var callback = replace;
35
+ // search string is not RegExp
36
+ if(!(search instanceof RegExp)){
37
+ var idx = str.indexOf(search);
38
+ return (
39
+ idx == -1 ? str :
40
+ default_replace.apply(str,[search,callback(search, idx, str)])
41
+ )
42
+ }
43
+ var reg = search;
44
+ var result = [];
45
+ var lastidx = reg.lastIndex;
46
+ var re;
47
+ while((re = reg.exec(str)) != null){
48
+ var idx = re.index;
49
+ var args = re.concat(idx, str);
50
+ result.push(
51
+ str.slice(lastidx,idx),
52
+ callback.apply(null,args).toString()
53
+ );
54
+ if(!reg.global){
55
+ lastidx += RegExp.lastMatch.length;
56
+ break
57
+ }else{
58
+ lastidx = reg.lastIndex;
59
+ }
60
+ }
61
+ result.push(str.slice(lastidx));
62
+ return result.join("")
63
+ }
64
+ })();
65
+
66
+ var CodeHighlighter = { styleSets : new Array };
67
+
68
+ CodeHighlighter.addStyle = function(name, rules) {
69
+ // using push test to disallow older browsers from adding styleSets
70
+ if ([].push) this.styleSets.push({
71
+ name : name,
72
+ rules : rules,
73
+ ignoreCase : arguments[2] || false
74
+ })
75
+
76
+ function setEvent() {
77
+ // set highlighter to run on load (use LowPro if present)
78
+ if (typeof Event != 'undefined' && typeof Event.onReady == 'function')
79
+ return Event.onReady(CodeHighlighter.init.bind(CodeHighlighter));
80
+
81
+ var old = window.onload;
82
+
83
+ if (typeof window.onload != 'function') {
84
+ window.onload = function() { CodeHighlighter.init() };
85
+ } else {
86
+ window.onload = function() {
87
+ old();
88
+ CodeHighlighter.init();
89
+ }
90
+ }
91
+ }
92
+
93
+ // only set the event when the first style is added
94
+ if (this.styleSets.length==1) setEvent();
95
+ }
96
+
97
+ CodeHighlighter.init = function() {
98
+ if (!document.getElementsByTagName) return;
99
+ if ("a".replace(/a/, function() {return "b"}) != "b") return; // throw out Safari versions that don't support replace function
100
+ // throw out older browsers
101
+
102
+ var codeEls = document.getElementsByTagName("CODE");
103
+ // collect array of all pre elements
104
+ codeEls.filter = function(f) {
105
+ var a = new Array;
106
+ for (var i = 0; i < this.length; i++) if (f(this[i])) a[a.length] = this[i];
107
+ return a;
108
+ }
109
+
110
+ var rules = new Array;
111
+ rules.toString = function() {
112
+ // joins regexes into one big parallel regex
113
+ var exps = new Array;
114
+ for (var i = 0; i < this.length; i++) exps.push(this[i].exp);
115
+ return exps.join("|");
116
+ }
117
+
118
+ function addRule(className, rule) {
119
+ // add a replace rule
120
+ var exp = (typeof rule.exp != "string")?String(rule.exp).substr(1, String(rule.exp).length-2):rule.exp;
121
+ // converts regex rules to strings and chops of the slashes
122
+ rules.push({
123
+ className : className,
124
+ exp : "(" + exp + ")",
125
+ length : (exp.match(/(^|[^\\])\([^?]/g) || "").length + 1, // number of subexps in rule
126
+ replacement : rule.replacement || null
127
+ });
128
+ }
129
+
130
+ function parse(text, ignoreCase) {
131
+ // main text parsing and replacement
132
+ return text.replace(new RegExp(rules, (ignoreCase)?"gi":"g"), function() {
133
+ var i = 0, j = 1, rule;
134
+ while (rule = rules[i++]) {
135
+ if (arguments[j]) {
136
+ // if no custom replacement defined do the simple replacement
137
+ if (!rule.replacement) return "<span class=\"" + rule.className + "\">" + arguments[0] + "</span>";
138
+ else {
139
+ // replace $0 with the className then do normal replaces
140
+ var str = rule.replacement.replace("$0", rule.className);
141
+ for (var k = 1; k <= rule.length - 1; k++) str = str.replace("$" + k, arguments[j + k]);
142
+ return str;
143
+ }
144
+ } else j+= rule.length;
145
+ }
146
+ });
147
+ }
148
+
149
+ function highlightCode(styleSet) {
150
+ // clear rules array
151
+ var parsed, clsRx = new RegExp("(\\s|^)" + styleSet.name + "(\\s|$)");
152
+ rules.length = 0;
153
+
154
+ // get stylable elements by filtering out all code elements without the correct className
155
+ var stylableEls = codeEls.filter(function(item) { return clsRx.test(item.className) });
156
+
157
+ // add style rules to parser
158
+ for (var className in styleSet.rules) addRule(className, styleSet.rules[className]);
159
+
160
+
161
+ // replace for all elements
162
+ for (var i = 0; i < stylableEls.length; i++) {
163
+ // EVIL hack to fix IE whitespace badness if it's inside a <pre>
164
+ if (/MSIE/.test(navigator.appVersion) && stylableEls[i].parentNode.nodeName == 'PRE') {
165
+ stylableEls[i] = stylableEls[i].parentNode;
166
+
167
+ parsed = stylableEls[i].innerHTML.replace(/(<code[^>]*>)([^<]*)<\/code>/i, function() {
168
+ return arguments[1] + parse(arguments[2], styleSet.ignoreCase) + "</code>"
169
+ });
170
+ parsed = parsed.replace(/\n( *)/g, function() {
171
+ var spaces = "";
172
+ for (var i = 0; i < arguments[1].length; i++) spaces+= "&nbsp;";
173
+ return "\n" + spaces;
174
+ });
175
+ parsed = parsed.replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp;");
176
+ parsed = parsed.replace(/\n(<\/\w+>)?/g, "<br />$1").replace(/<br \/>[\n\r\s]*<br \/>/g, "<p><br></p>");
177
+
178
+ } else parsed = parse(stylableEls[i].innerHTML, styleSet.ignoreCase);
179
+
180
+ stylableEls[i].innerHTML = parsed;
181
+ }
182
+ }
183
+
184
+ // run highlighter on all stylesets
185
+ for (var i=0; i < this.styleSets.length; i++) {
186
+ highlightCode(this.styleSets[i]);
187
+ }
188
+ }
@@ -0,0 +1,8 @@
1
+ function guideMenu(){
2
+
3
+ if (document.getElementById('guides').style.display == "none") {
4
+ document.getElementById('guides').style.display = "block";
5
+ } else {
6
+ document.getElementById('guides').style.display = "none";
7
+ }
8
+ }
@@ -0,0 +1,90 @@
1
+ CodeHighlighter.addStyle("css", {
2
+ comment : {
3
+ exp : /\/\*[^*]*\*+([^\/][^*]*\*+)*\//
4
+ },
5
+ keywords : {
6
+ exp : /@\w[\w\s]*/
7
+ },
8
+ selectors : {
9
+ exp : "([\\w-:\\[.#][^{};>]*)(?={)"
10
+ },
11
+ properties : {
12
+ exp : "([\\w-]+)(?=\\s*:)"
13
+ },
14
+ units : {
15
+ exp : /([0-9])(em|en|px|%|pt)\b/,
16
+ replacement : "$1<span class=\"$0\">$2</span>"
17
+ },
18
+ urls : {
19
+ exp : /url\([^\)]*\)/
20
+ }
21
+ });
22
+
23
+ CodeHighlighter.addStyle("ruby",{
24
+ comment : {
25
+ exp : /#[^\n]+/
26
+ },
27
+ brackets : {
28
+ exp : /\(|\)/
29
+ },
30
+ string : {
31
+ exp : /'[^']*'|"[^"]*"/
32
+ },
33
+ keywords : {
34
+ exp : /\b(do|end|self|class|def|if|module|yield|then|else|for|until|unless|while|elsif|case|when|break|retry|redo|rescue|require|raise)\b/
35
+ },
36
+ /* Added by Shelly Fisher (shelly@agileevolved.com) */
37
+ symbol : {
38
+ exp : /([^:])(:[A-Za-z0-9_!?]+)/
39
+ },
40
+ ivar : {
41
+ exp : /\@[A-Za-z0-9_!?]+/
42
+ }
43
+ });
44
+
45
+ CodeHighlighter.addStyle("html", {
46
+ comment : {
47
+ exp: /&lt;!\s*(--([^-]|[\r\n]|-[^-])*--\s*)&gt;/
48
+ },
49
+ tag : {
50
+ exp: /(&lt;\/?)([a-zA-Z1-9]+\s?)/,
51
+ replacement: "$1<span class=\"$0\">$2</span>"
52
+ },
53
+ string : {
54
+ exp : /'[^']*'|"[^"]*"/
55
+ },
56
+ attribute : {
57
+ exp: /\b([a-zA-Z-:]+)(=)/,
58
+ replacement: "<span class=\"$0\">$1</span>$2"
59
+ },
60
+ doctype : {
61
+ exp: /&lt;!DOCTYPE([^&]|&[^g]|&g[^t])*&gt;/
62
+ }
63
+ });
64
+
65
+ CodeHighlighter.addStyle("javascript",{
66
+ comment : {
67
+ exp : /(\/\/[^\n]*(\n|$))|(\/\*[^*]*\*+([^\/][^*]*\*+)*\/)/
68
+ },
69
+ brackets : {
70
+ exp : /\(|\)/
71
+ },
72
+ string : {
73
+ exp : /'[^']*'|"[^"]*"/
74
+ },
75
+ keywords : {
76
+ exp : /\b(arguments|break|case|continue|default|delete|do|else|false|for|function|if|in|instanceof|new|null|return|switch|this|true|typeof|var|void|while|with)\b/
77
+ },
78
+ global : {
79
+ exp : /\b(toString|valueOf|window|element|prototype|constructor|document|escape|unescape|parseInt|parseFloat|setTimeout|clearTimeout|setInterval|clearInterval|NaN|isNaN|Infinity)\b/
80
+ }
81
+ });
82
+
83
+ CodeHighlighter.addStyle("yaml", {
84
+ keyword : {
85
+ exp : /\/\*[^*]*\*+([^\/][^*]*\*+)*\//
86
+ },
87
+ value : {
88
+ exp : /@\w[\w\s]*/
89
+ },
90
+ });
@@ -0,0 +1,441 @@
1
+ /* Guides.rubyonrails.org */
2
+ /* Main.css */
3
+ /* Created January 30, 2009 */
4
+ /* Modified February 8, 2009
5
+ --------------------------------------- */
6
+
7
+ /* General
8
+ --------------------------------------- */
9
+
10
+ .left {float: left; margin-right: 1em;}
11
+ .right {float: right; margin-left: 1em;}
12
+ .small {font-size: smaller;}
13
+ .large {font-size: larger;}
14
+ .hide {display: none;}
15
+
16
+ li ul, li ol { margin:0 1.5em; }
17
+ ul, ol { margin: 0 1.5em 1.5em 1.5em; }
18
+
19
+ ul { list-style-type: disc; }
20
+ ol { list-style-type: decimal; }
21
+
22
+ dl { margin: 0 0 1.5em 0; }
23
+ dl dt { font-weight: bold; }
24
+ dd { margin-left: 1.5em;}
25
+
26
+ pre,code { margin: 1.5em 0; white-space: pre; overflow: auto; }
27
+ pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height: 1.5; }
28
+
29
+ abbr, acronym { border-bottom: 1px dotted #666; }
30
+ address { margin: 0 0 1.5em; font-style: italic; }
31
+ del { color:#666; }
32
+
33
+ blockquote { margin: 1.5em; color: #666; font-style: italic; }
34
+ strong { font-weight: bold; }
35
+ em, dfn { font-style: italic; }
36
+ dfn { font-weight: bold; }
37
+ sup, sub { line-height: 0; }
38
+ p {margin: 0 0 1.5em;}
39
+
40
+ label { font-weight: bold; }
41
+ fieldset { padding:1.4em; margin: 0 0 1.5em 0; border: 1px solid #ccc; }
42
+ legend { font-weight: bold; font-size:1.2em; }
43
+
44
+ input.text, input.title,
45
+ textarea, select {
46
+ margin:0.5em 0;
47
+ border:1px solid #bbb;
48
+ }
49
+
50
+ table {
51
+ margin: 0 0 1.5em;
52
+ border: 2px solid #CCC;
53
+ background: #FFF;
54
+ border-collapse: collapse;
55
+ }
56
+
57
+ table th, table td {
58
+ padding: 0.25em 1em;
59
+ border: 1px solid #CCC;
60
+ border-collapse: collapse;
61
+ }
62
+
63
+ table th {
64
+ border-bottom: 2px solid #CCC;
65
+ background: #EEE;
66
+ font-weight: bold;
67
+ padding: 0.5em 1em;
68
+ }
69
+
70
+
71
+ /* Structure and Layout
72
+ --------------------------------------- */
73
+
74
+ body {
75
+ text-align: center;
76
+ font-family: Helvetica, Arial, sans-serif;
77
+ font-size: 87.5%;
78
+ line-height: 1.5em;
79
+ background: #222;
80
+ color: #999;
81
+ }
82
+
83
+ .wrapper {
84
+ text-align: left;
85
+ margin: 0 auto;
86
+ width: 69em;
87
+ }
88
+
89
+ #topNav {
90
+ padding: 1em 0;
91
+ color: #565656;
92
+ }
93
+
94
+ #header {
95
+ background: #c52f24 url(../../images/header_tile.gif) repeat-x;
96
+ color: #FFF;
97
+ padding: 1.5em 0;
98
+ position: relative;
99
+ z-index: 99;
100
+ }
101
+
102
+ #feature {
103
+ background: #d5e9f6 url(../../images/feature_tile.gif) repeat-x;
104
+ color: #333;
105
+ padding: 0.5em 0 1.5em;
106
+ }
107
+
108
+ #container {
109
+ background: #FFF;
110
+ color: #333;
111
+ padding: 0.5em 0 1.5em 0;
112
+ }
113
+
114
+ #mainCol {
115
+ width: 45em;
116
+ margin-left: 2em;
117
+ }
118
+
119
+ #subCol {
120
+ position: absolute;
121
+ z-index: 0;
122
+ top: 0;
123
+ right: 0;
124
+ background: #FFF;
125
+ padding: 1em 1.5em 1em 1.25em;
126
+ width: 17em;
127
+ font-size: 0.9285em;
128
+ line-height: 1.3846em;
129
+ }
130
+
131
+ #extraCol {display: none;}
132
+
133
+ #footer {
134
+ padding: 2em 0;
135
+ background: url(../../images/footer_tile.gif) repeat-x;
136
+ }
137
+ #footer .wrapper {
138
+ padding-left: 2em;
139
+ width: 67em;
140
+ }
141
+
142
+ #header .wrapper, #topNav .wrapper, #feature .wrapper {padding-left: 1em; width: 68em;}
143
+ #feature .wrapper {width: 45em; padding-right: 23em; position: relative; z-index: 0;}
144
+
145
+ /* Links
146
+ --------------------------------------- */
147
+
148
+ a, a:link, a:visited {
149
+ color: #ee3f3f;
150
+ text-decoration: underline;
151
+ }
152
+
153
+ #mainCol a, #subCol a, #feature a {color: #980905;}
154
+
155
+
156
+ /* Navigation
157
+ --------------------------------------- */
158
+
159
+ .nav {margin: 0; padding: 0;}
160
+ .nav li {display: inline; list-style: none;}
161
+
162
+ #header .nav {
163
+ float: right;
164
+ margin-top: 1.5em;
165
+ font-size: 1.2857em;
166
+ }
167
+
168
+ #header .nav li {margin: 0 0 0 0.5em;}
169
+ #header .nav a {color: #FFF; text-decoration: none;}
170
+ #header .nav a:hover {text-decoration: underline;}
171
+
172
+ #header .nav .index {
173
+ padding: 0.5em 1.5em;
174
+ border-radius: 1em;
175
+ -webkit-border-radius: 1em;
176
+ -moz-border-radius: 1em;
177
+ background: #980905;
178
+ position: relative;
179
+ }
180
+
181
+ #header .nav .index a {
182
+ background: #980905 url(../../images/nav_arrow.gif) no-repeat right top;
183
+ padding-right: 1em;
184
+ position: relative;
185
+ z-index: 15;
186
+ padding-bottom: 0.125em;
187
+ }
188
+ #header .nav .index:hover a, #header .nav .index a:hover {background-position: right -81px;}
189
+
190
+ #guides {
191
+ width: 27em;
192
+ display: block;
193
+ background: #980905;
194
+ border-radius: 1em;
195
+ -webkit-border-radius: 1em;
196
+ -moz-border-radius: 1em;
197
+ -webkit-box-shadow: 0.25em 0.25em 1em rgba(0,0,0,0.25);
198
+ -moz-box-shadow: rgba(0,0,0,0.25) 0.25em 0.25em 1em;
199
+ color: #f1938c;
200
+ padding: 1.5em 2em;
201
+ position: absolute;
202
+ z-index: 10;
203
+ top: -0.25em;
204
+ right: 0;
205
+ padding-top: 2em;
206
+ }
207
+
208
+ #guides dt, #guides dd {
209
+ font-weight: normal;
210
+ font-size: 0.722em;
211
+ margin: 0;
212
+ padding: 0;
213
+ }
214
+ #guides dt {padding:0; margin: 0.5em 0 0;}
215
+ #guides a {color: #FFF; background: none !important;}
216
+ #guides .L, #guides .R {float: left; width: 50%; margin: 0; padding: 0;}
217
+ #guides .R {float: right;}
218
+ #guides hr {
219
+ display: block;
220
+ border: none;
221
+ height: 1px;
222
+ color: #f1938c;
223
+ background: #f1938c;
224
+ }
225
+
226
+ /* Headings
227
+ --------------------------------------- */
228
+
229
+ h1 {
230
+ font-size: 2.5em;
231
+ line-height: 1em;
232
+ margin: 0.6em 0 .2em;
233
+ font-weight: bold;
234
+ }
235
+
236
+ h2 {
237
+ font-size: 2.1428em;
238
+ line-height: 1em;
239
+ margin: 0.7em 0 .2333em;
240
+ font-weight: bold;
241
+ }
242
+
243
+ h3 {
244
+ font-size: 1.7142em;
245
+ line-height: 1.286em;
246
+ margin: 0.875em 0 0.2916em;
247
+ font-weight: bold;
248
+ }
249
+
250
+ h4 {
251
+ font-size: 1.2857em;
252
+ line-height: 1.2em;
253
+ margin: 1.6667em 0 .3887em;
254
+ font-weight: bold;
255
+ }
256
+
257
+ h5 {
258
+ font-size: 1em;
259
+ line-height: 1.5em;
260
+ margin: 1em 0 .5em;
261
+ font-weight: bold;
262
+ }
263
+
264
+ h6 {
265
+ font-size: 1em;
266
+ line-height: 1.5em;
267
+ margin: 1em 0 .5em;
268
+ font-weight: normal;
269
+ }
270
+
271
+ .section {
272
+ padding-bottom: 0.25em;
273
+ border-bottom: 1px solid #999;
274
+ }
275
+
276
+ /* Content
277
+ --------------------------------------- */
278
+
279
+ .pic {
280
+ margin: 0 2em 2em 0;
281
+ }
282
+
283
+ #topNav strong {color: #999; margin-right: 0.5em;}
284
+ #topNav strong a {color: #FFF;}
285
+
286
+ #header h1 {
287
+ float: left;
288
+ background: url(../../images/rails_guides_logo.gif) no-repeat;
289
+ width: 297px;
290
+ text-indent: -9999em;
291
+ margin: 0;
292
+ padding: 0;
293
+ }
294
+
295
+ #header h1 a {
296
+ text-decoration: none;
297
+ display: block;
298
+ height: 77px;
299
+ }
300
+
301
+ #feature p {
302
+ font-size: 1.2857em;
303
+ margin-bottom: 0.75em;
304
+ }
305
+
306
+ #feature ul {margin-left: 0;}
307
+ #feature ul li {
308
+ list-style: none;
309
+ background: url(../../images/check_bullet.gif) no-repeat left 0.5em;
310
+ padding: 0.5em 1.75em 0.5em 1.75em;
311
+ font-size: 1.1428em;
312
+ font-weight: bold;
313
+ }
314
+
315
+ #mainCol dd, #subCol dd {
316
+ padding: 0.25em 0 1em;
317
+ border-bottom: 1px solid #CCC;
318
+ margin-bottom: 1em;
319
+ margin-left: 0;
320
+ /*padding-left: 28px;*/
321
+ padding-left: 0;
322
+ }
323
+
324
+ #mainCol dt, #subCol dt {
325
+ font-size: 1.2857em;
326
+ padding: 0.125em 0 0.25em 0;
327
+ margin-bottom: 0;
328
+ /*background: url(../../images/book_icon.gif) no-repeat left top;
329
+ padding: 0.125em 0 0.25em 28px;*/
330
+ }
331
+
332
+ #mainCol dd.ticket, #subCol dd.ticket {
333
+ background: #fff9d8 url(../../images/tab_yellow.gif) no-repeat left top;
334
+ border: none;
335
+ padding: 1.25em 1em 1.25em 48px;
336
+ margin-left: 0;
337
+ margin-top: 0.25em;
338
+ }
339
+
340
+ #mainCol div.warning, #subCol dd.warning {
341
+ background: #f9d9d8 url(../../images/tab_red.gif) no-repeat left top;
342
+ border: none;
343
+ padding: 1.25em 1.25em 1.25em 48px;
344
+ margin-left: 0;
345
+ margin-top: 0.25em;
346
+ }
347
+
348
+ #subCol .chapters {color: #980905;}
349
+ #subCol .chapters a {font-weight: bold;}
350
+ #subCol .chapters ul a {font-weight: normal;}
351
+ #subCol .chapters li {margin-bottom: 0.75em;}
352
+ #subCol h3.chapter {margin-top: 0.25em;}
353
+ #subCol h3.chapter img {vertical-align: text-bottom;}
354
+ #subCol .chapters ul {margin-left: 0; margin-top: 0.5em;}
355
+ #subCol .chapters ul li {
356
+ list-style: none;
357
+ padding: 0 0 0 1em;
358
+ background: url(../../images/bullet.gif) no-repeat left 0.45em;
359
+ margin-left: 0;
360
+ font-size: 1em;
361
+ font-weight: normal;
362
+ }
363
+
364
+ tt {
365
+ font-family: monaco, "Bitstream Vera Sans Mono", "Courier New", courier, monospace;
366
+ }
367
+
368
+ div.code_container {
369
+ background: #EEE url(../../images/tab_grey.gif) no-repeat left top;
370
+ padding: 0.25em 1em 0.5em 48px;
371
+ }
372
+
373
+ code {
374
+ font-family: monaco, "Bitstream Vera Sans Mono", "Courier New", courier, monospace;
375
+ border: none;
376
+ margin: 0.25em 0 1.5em 0;
377
+ display: block;
378
+ }
379
+
380
+ .note {
381
+ background: #fff9d8 url(../../images/tab_note.gif) no-repeat left top;
382
+ border: none;
383
+ padding: 1em 1em 0.25em 48px;
384
+ margin: 0.25em 0 1.5em 0;
385
+ }
386
+
387
+ .info {
388
+ background: #d5e9f6 url(../../images/tab_info.gif) no-repeat left top;
389
+ border: none;
390
+ padding: 1em 1em 0.25em 48px;
391
+ margin: 0.25em 0 1.5em 0;
392
+ }
393
+
394
+ .note tt, .info tt {border:none; background: none; padding: 0;}
395
+
396
+ #mainCol ul li {
397
+ list-style:none;
398
+ background: url(../../images/grey_bullet.gif) no-repeat left 0.5em;
399
+ padding-left: 1em;
400
+ margin-left: 0;
401
+ }
402
+
403
+ #subCol .content {
404
+ font-size: 0.7857em;
405
+ line-height: 1.5em;
406
+ }
407
+
408
+ #subCol .content li {
409
+ font-weight: normal;
410
+ background: none;
411
+ padding: 0 0 1em;
412
+ font-size: 1.1667em;
413
+ }
414
+
415
+ /* Clearing
416
+ --------------------------------------- */
417
+
418
+ .clearfix:after {
419
+ content: ".";
420
+ display: block;
421
+ height: 0;
422
+ clear: both;
423
+ visibility: hidden;
424
+ }
425
+
426
+ .clearfix {display: inline-block;}
427
+ * html .clearfix {height: 1%;}
428
+ .clearfix {display: block;}
429
+ .clear { clear:both; }
430
+
431
+ /* Same bottom margin for special boxes than for regular paragraphs, this way
432
+ intermediate whitespace looks uniform. */
433
+ div.code_container, div.important, div.caution, div.warning, div.note, div.info {
434
+ margin-bottom: 1.5em;
435
+ }
436
+
437
+ /* Remove bottom margin of paragraphs in special boxes, otherwise they get a
438
+ spurious blank area below with the box background. */
439
+ div.important p, div.caution p, div.warning p, div.note p, div.info p {
440
+ margin-bottom: 0px;
441
+ }