hobo 2.0.0.pre7 → 2.0.0.pre8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGES-1.4.txt CHANGED
@@ -12,7 +12,7 @@ Contents
12
12
 
13
13
  # Installation
14
14
 
15
- Meta tags: note for collaborators. A meta-tag looks like this {.done}. It's added after a paragraph with no blank spaces. The tags that we support are: {.ruby} {.javascript} {.dryml} and {.diff} for code highlighting. {.todo}, {.done}, {.check}, {.part} and {.nomove} indicate documentation progress moving into the Hobo manuals. {.check} means that it's probably done. {.part} means that it's partly done. {.nomove} means that this section only needs to exist in this CHANGES document. Finally, {.hidden} is used for paragraphs like this one that shouldn't show up on the website.
15
+ Meta tags: note for collaborators. A meta-tag looks like this {.done}. It's added after a paragraph with no blank spaces. The tags that we support are: {.ruby} {.javascript} {.dryml} and {.diff} for code highlighting. {.todo}, {.done}, {.check}, {.part} and {.nomove} indicate documentation progress moving into the Hobo manuals. {.check} means that it's probably done. {.part} means that it's partly done. {.nomove} means that this section only needs to exist in this CHANGES document. Finally, {.hidden} is used for paragraphs like this one that shouldn't show up on the website.
16
16
  {.hidden}
17
17
 
18
18
  ## Creating a new application
@@ -340,13 +340,12 @@ Hobo 2.0 currently requires Rails 3.2 for operation.
340
340
  ## Enhancements
341
341
 
342
342
  ### Nested caching
343
- {.todo}
343
+ {.done}
344
344
 
345
- See the docs for `<nested-cache>` and the blog post I'm going to
346
- eventually write...
345
+ See the docs for `<nested-cache>` and the [caching-tutorial](/tutorials/caching).
347
346
 
348
347
  ### push-state
349
- {.todo}
348
+ {.done}
350
349
 
351
350
  AJAX now supports a new AJAX option 'push-state' if you have
352
351
  History.js installed. It was inspired by [this
@@ -505,7 +504,7 @@ environment.
505
504
  bottom-load-javascript is incompatible with turbolinks.
506
505
 
507
506
  ### allowing errors in parts
508
- {.todo}
507
+ {.done}
509
508
 
510
509
  Older versions of Hobo did not render a part update if the update did
511
510
  not pass validation.
@@ -561,7 +560,7 @@ itself, and passes the element as an argument.
561
560
  </new-page>
562
561
 
563
562
  ### before callback
564
- {.todo}
563
+ {.done}
565
564
 
566
565
  A new callback has been added to the list of Ajax Callbacks: before.
567
566
  This callback fires before any Ajax is done. If you return false
@@ -570,7 +569,7 @@ explicitly return true if you use it and don't want your ajax
570
569
  cancelled.
571
570
 
572
571
  ### callbacks
573
- {.todo}
572
+ {.done}
574
573
 
575
574
  Normally in HTML you can attach either a snippet of javascript or a
576
575
  function to a callback.
@@ -589,12 +588,12 @@ Now you can just return the function name:
589
588
  <form ajax success="fbar"/>
590
589
 
591
590
  ### `hide` and `show` ajax options
592
- {.todo}
591
+ {.done}
593
592
 
594
593
  There are two new ajax options: `hide` and `show`. These are passed
595
594
  directly to the jQuery-UI `hide` and `show` functions. See
596
- (here)[http://jqueryui.com/demos/show/] and
597
- (here)[http://docs.jquery.com/UI/Effects] for more documentation on
595
+ [here](http://jqueryui.com/demos/show/) and
596
+ [here](http://docs.jquery.com/UI/Effects) for more documentation on
598
597
  these two functions. Due to ruby to javascript translation
599
598
  difficulties, you may not drop optional middle parameters.
600
599
 
@@ -619,7 +618,7 @@ If, after changing the default you wish to disable effects on one specific ajax
619
618
  Note that these effects require jQuery-UI. You will get Javascript errors if you attempt to use effects and do not have jQuery-UI installed.
620
619
 
621
620
  ### spinner options
622
- {.todo}
621
+ {.done}
623
622
 
624
623
  By default, the spinner is now displayed next to the element being
625
624
  updated. Besides the old `spinner-next-to` option, there are a number
@@ -764,6 +763,7 @@ There's a new helper function called query_parameters_filtered that
764
763
  returns query parameters with the ajax parameters removed.
765
764
 
766
765
  ### parse_sort_param
766
+ {.done}
767
767
 
768
768
  The controller function parse_sort_param has been updated so that it
769
769
  can take a hash instead of or as well as an argument list. The key of
@@ -781,7 +781,7 @@ column "projects.title".
781
781
 
782
782
  Hobo no longer attempts to perform its part-based AJAX actions when
783
783
  sent an xhr request. Instead, Hobo performs part-based AJAX when
784
- params[:render] is set.
784
+ `params[:render]` is set.
785
785
 
786
786
  The signature for the function update_response, index_response and friends have changed. This should make it useful for use in your application. update_response is called automatically by hobo_update if you don't render or redirect inside of the block parameter hobo_update.
787
787
 
data/CHANGES-2.0.markdown CHANGED
@@ -12,7 +12,7 @@ Contents
12
12
 
13
13
  # Installation
14
14
 
15
- Meta tags: note for collaborators. A meta-tag looks like this {.done}. It's added after a paragraph with no blank spaces. The tags that we support are: {.ruby} {.javascript} {.dryml} and {.diff} for code highlighting. {.todo}, {.done}, {.check}, {.part} and {.nomove} indicate documentation progress moving into the Hobo manuals. {.check} means that it's probably done. {.part} means that it's partly done. {.nomove} means that this section only needs to exist in this CHANGES document. Finally, {.hidden} is used for paragraphs like this one that shouldn't show up on the website.
15
+ Meta tags: note for collaborators. A meta-tag looks like this {.done}. It's added after a paragraph with no blank spaces. The tags that we support are: {.ruby} {.javascript} {.dryml} and {.diff} for code highlighting. {.todo}, {.done}, {.check}, {.part} and {.nomove} indicate documentation progress moving into the Hobo manuals. {.check} means that it's probably done. {.part} means that it's partly done. {.nomove} means that this section only needs to exist in this CHANGES document. Finally, {.hidden} is used for paragraphs like this one that shouldn't show up on the website.
16
16
  {.hidden}
17
17
 
18
18
  ## Creating a new application
@@ -340,13 +340,12 @@ Hobo 2.0 currently requires Rails 3.2 for operation.
340
340
  ## Enhancements
341
341
 
342
342
  ### Nested caching
343
- {.todo}
343
+ {.done}
344
344
 
345
- See the docs for `<nested-cache>` and the blog post I'm going to
346
- eventually write...
345
+ See the docs for `<nested-cache>` and the [caching-tutorial](/tutorials/caching).
347
346
 
348
347
  ### push-state
349
- {.todo}
348
+ {.done}
350
349
 
351
350
  AJAX now supports a new AJAX option 'push-state' if you have
352
351
  History.js installed. It was inspired by [this
@@ -505,7 +504,7 @@ environment.
505
504
  bottom-load-javascript is incompatible with turbolinks.
506
505
 
507
506
  ### allowing errors in parts
508
- {.todo}
507
+ {.done}
509
508
 
510
509
  Older versions of Hobo did not render a part update if the update did
511
510
  not pass validation.
@@ -561,7 +560,7 @@ itself, and passes the element as an argument.
561
560
  </new-page>
562
561
 
563
562
  ### before callback
564
- {.todo}
563
+ {.done}
565
564
 
566
565
  A new callback has been added to the list of Ajax Callbacks: before.
567
566
  This callback fires before any Ajax is done. If you return false
@@ -570,7 +569,7 @@ explicitly return true if you use it and don't want your ajax
570
569
  cancelled.
571
570
 
572
571
  ### callbacks
573
- {.todo}
572
+ {.done}
574
573
 
575
574
  Normally in HTML you can attach either a snippet of javascript or a
576
575
  function to a callback.
@@ -589,12 +588,12 @@ Now you can just return the function name:
589
588
  <form ajax success="fbar"/>
590
589
 
591
590
  ### `hide` and `show` ajax options
592
- {.todo}
591
+ {.done}
593
592
 
594
593
  There are two new ajax options: `hide` and `show`. These are passed
595
594
  directly to the jQuery-UI `hide` and `show` functions. See
596
- (here)[http://jqueryui.com/demos/show/] and
597
- (here)[http://docs.jquery.com/UI/Effects] for more documentation on
595
+ [here](http://jqueryui.com/demos/show/) and
596
+ [here](http://docs.jquery.com/UI/Effects) for more documentation on
598
597
  these two functions. Due to ruby to javascript translation
599
598
  difficulties, you may not drop optional middle parameters.
600
599
 
@@ -619,7 +618,7 @@ If, after changing the default you wish to disable effects on one specific ajax
619
618
  Note that these effects require jQuery-UI. You will get Javascript errors if you attempt to use effects and do not have jQuery-UI installed.
620
619
 
621
620
  ### spinner options
622
- {.todo}
621
+ {.done}
623
622
 
624
623
  By default, the spinner is now displayed next to the element being
625
624
  updated. Besides the old `spinner-next-to` option, there are a number
@@ -764,6 +763,7 @@ There's a new helper function called query_parameters_filtered that
764
763
  returns query parameters with the ajax parameters removed.
765
764
 
766
765
  ### parse_sort_param
766
+ {.done}
767
767
 
768
768
  The controller function parse_sort_param has been updated so that it
769
769
  can take a hash instead of or as well as an argument list. The key of
@@ -781,7 +781,7 @@ column "projects.title".
781
781
 
782
782
  Hobo no longer attempts to perform its part-based AJAX actions when
783
783
  sent an xhr request. Instead, Hobo performs part-based AJAX when
784
- params[:render] is set.
784
+ `params[:render]` is set.
785
785
 
786
786
  The signature for the function update_response, index_response and friends have changed. This should make it useful for use in your application. update_response is called automatically by hobo_update if you don't render or redirect inside of the block parameter hobo_update.
787
787
 
data/Gemfile CHANGED
@@ -1,9 +1,15 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  gem 'rubydoctest', :git => 'git://github.com/bryanlarsen/rubydoctest.git'
4
- gem 'rails', '3.2.8'
4
+ gem 'rails', '3.2.11'
5
5
  gemspec :path => "../dryml"
6
6
  gemspec :path => "../hobo_support"
7
7
  gemspec :path => "../hobo_fields"
8
8
  gemspec
9
9
  gem 'will_paginate', :git => 'git://github.com/Hobo/will_paginate.git'
10
+ platform :ruby do
11
+ gem 'sqlite3'
12
+ end
13
+ platform :jruby do
14
+ gem 'activerecord-jdbcsqlite3-adapter'
15
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.0.pre7
1
+ 2.0.0.pre8
@@ -165,12 +165,18 @@ module HoboRouteHelper
165
165
  def recognize_page_path
166
166
  # round tripping params through the router will remove
167
167
  # unnecessary params
168
- url = params[:page_path] || url_for(params)
168
+ if params[:page_path]
169
+ url = params[:page_path]
170
+ method = "GET"
171
+ else
172
+ url = url_for(params)
173
+ method = request.method
174
+ end
169
175
  if ENV['RAILS_RELATIVE_URL_ROOT']
170
176
  url.gsub!(/^#{ENV['RAILS_RELATIVE_URL_ROOT']}/, "")
171
177
  url.gsub!(/^https?:\/\/.*?#{ENV['RAILS_RELATIVE_URL_ROOT']}/, "")
172
178
  end
173
- Rails.application.routes.recognize_path(url)
179
+ Rails.application.routes.recognize_path(url, :method => method)
174
180
  end
175
181
 
176
182
  def url_for_page_path(options={})
data/hobo.gemspec CHANGED
@@ -20,7 +20,6 @@ Gem::Specification.new do |s|
20
20
  s.add_development_dependency('shoulda', [">= 0"])
21
21
  s.add_development_dependency('irt', ["= 1.2.11"])
22
22
  s.add_development_dependency('mocha')
23
- s.add_development_dependency('sqlite3')
24
23
  s.add_development_dependency('yard')
25
24
 
26
25
  s.executables = ["hobo"]
@@ -17,12 +17,16 @@ module Hobo
17
17
  install_plugin_helper('hobo_rapid', nil, opts.merge(:skip_dryml => true, :skip_gem => true))
18
18
  say "Installing hobo_jquery plugin..."
19
19
  install_plugin_helper('hobo_jquery', nil, opts.merge(:skip_gem => true))
20
+ say "Installing #{opts[:theme]} theme..."
21
+ install_plugin_helper(opts[:theme], nil, opts)
20
22
  say "Installing hobo_jquery_ui plugin..."
21
23
  install_plugin_helper('hobo_jquery_ui', nil, opts)
24
+ if opts[:theme]=='hobo_bootstrap'
25
+ say "Installing hobo_bootstrap_ui plugin..."
26
+ install_plugin_helper('hobo_bootstrap_ui', nil, opts)
27
+ end
22
28
 
23
- say "Installing #{opts[:theme]} theme..."
24
29
  inject_css_require("jquery-ui/#{opts[:ui_theme]}", opts[:subsite], nil)
25
- install_plugin_helper(opts[:theme], nil, opts)
26
30
 
27
31
  unless opts[:skip_gem]
28
32
  gem_with_comments("jquery-ui-themes", "~> 0.0.4")
@@ -7,7 +7,7 @@
7
7
  <% end -%>
8
8
  timestamps
9
9
  end
10
- attr_accessible <%= accessible_attributes.map {|a| ":#{a.name}"}.join ", " %>
10
+ attr_accessible <%= accessible_attributes.map {|a| ":#{a}"}.join ", " %>
11
11
 
12
12
  <% for bt in bts -%>
13
13
  belongs_to :<%= bt %>
@@ -9,7 +9,7 @@ module Generators
9
9
 
10
10
  unless File.read("Gemfile") =~ /^gem ("|')#{name}/
11
11
  if (comments = options.delete(:comments))
12
- append_file "Gemfile", "#{comments}\n", :verbose => false
12
+ append_file "Gemfile", "#{comments}", :verbose => false
13
13
  end
14
14
 
15
15
  gem(args[0], args[1], options)
@@ -26,7 +26,7 @@ module Hobo
26
26
  :desc => "Front Controller Name", :default => 'front'
27
27
 
28
28
  class_option :front_theme, :type => :string,
29
- :desc => "Front Theme", :default => 'clean'
29
+ :desc => "Front Theme", :default => 'bootstrap'
30
30
 
31
31
  class_option :front_ui_theme, :type => :string,
32
32
  :desc => "Front jQuery-UI Theme", :default => 'redmond'
@@ -187,7 +187,7 @@ EOI
187
187
  if wizard?
188
188
  say_title 'Front Theme'
189
189
  say "The currently available themes are clean, clean_admin, clean_sidemenu and bootstrap."
190
- @front_theme = ask("Choose a theme for the front site: [<enter>=clean|<custom_name>]", 'clean')
190
+ @front_theme = ask("Choose a theme for the front site: [<enter>=bootstrap|<custom_name>]", 'bootstrap')
191
191
 
192
192
  say_title 'Front jQuery-UI Theme'
193
193
  say "The currently available jQuery-UI themes are listed here: https://github.com/fatdude/jquery-ui-themes-rails/blob/master/README.markdown"
@@ -71,6 +71,10 @@ module Hobo
71
71
 
72
72
 
73
73
  def ajax_update_response(render_specs, results={}, options={})
74
+ if render_specs.blank?
75
+ render :js => ''
76
+ return
77
+ end
74
78
  controller, action = controller_action_from_page_path
75
79
  identifier = view_context.view_paths.find( action,
76
80
  controller,
@@ -379,6 +379,7 @@ module Hobo
379
379
  if self.class.name == "#{controller.camelize}Controller" && action == "index"
380
380
  params['action'] = 'index'
381
381
  self.action_name = 'index'
382
+ self.this = find_or_paginate(model, {})
382
383
  index
383
384
  else
384
385
  render :template => "#{controller}/#{action}"
@@ -68,7 +68,7 @@ module Hobo
68
68
  flash[:error] = options[:failure_notice]
69
69
  hobo_ajax_response if request.xhr? && !performed?
70
70
  else
71
- self.sign_user_in(user, options){ yield if block_given?}
71
+ self.sign_user_in(user, options, &block)
72
72
  end
73
73
  end
74
74
  end
@@ -110,7 +110,7 @@ module Hobo
110
110
 
111
111
  def hobo_forgot_password
112
112
  if request.post?
113
- user = model.find_by_email_address(params[:email_address])
113
+ user = model.find_by_email_address(params[:email_address].to_s)
114
114
  if user && (!block_given? || yield(user))
115
115
  user.lifecycle.request_password_reset!(:nobody)
116
116
  end
@@ -166,7 +166,12 @@ module Hobo
166
166
  old_user = current_user
167
167
  self.current_user = user
168
168
 
169
- yield if block_given?
169
+ if block_given?
170
+ unless yield
171
+ self.current_user = nil
172
+ return
173
+ end
174
+ end
170
175
 
171
176
  if !user.account_active?
172
177
  # account not activate - cancel this login
@@ -31,6 +31,8 @@ module Hobo
31
31
  def create_scope(check_only=false)
32
32
  matched_scope = true
33
33
 
34
+ like_operator = ActiveRecord::Base.connection.adapter_name =~ /postg/i ? 'ILIKE' : 'LIKE'
35
+
34
36
  case
35
37
  # --- Association Queries --- #
36
38
 
@@ -152,7 +154,7 @@ module Hobo
152
154
  return true if check_only
153
155
 
154
156
  def_scope do |str|
155
- @klass.where "#{column_sql(col)} LIKE ?", "%#{str}%"
157
+ @klass.where "#{column_sql(col)} #{like_operator} ?", "%#{str}%"
156
158
  end
157
159
 
158
160
  # name_does_not_contain
@@ -160,7 +162,7 @@ module Hobo
160
162
  return true if check_only
161
163
 
162
164
  def_scope do |str|
163
- @klass.where "#{column_sql(col)} NOT LIKE ?", "%#{str}%"
165
+ @klass.where "#{column_sql(col)} NOT #{like_operator} ?", "%#{str}%"
164
166
  end
165
167
 
166
168
  # name_starts(str)
@@ -168,7 +170,7 @@ module Hobo
168
170
  return true if check_only
169
171
 
170
172
  def_scope do |str|
171
- @klass.where "#{column_sql(col)} LIKE ?", "#{str}%"
173
+ @klass.where "#{column_sql(col)} #{like_operator} ?", "#{str}%"
172
174
  end
173
175
 
174
176
  # name_does_not_start
@@ -176,7 +178,7 @@ module Hobo
176
178
  return true if check_only
177
179
 
178
180
  def_scope do |str|
179
- @klass.where "#{column_sql(col)} NOT LIKE ?", "#{str}%"
181
+ @klass.where "#{column_sql(col)} NOT #{like_operator} ?", "#{str}%"
180
182
  end
181
183
 
182
184
  # name_ends(str)
@@ -184,7 +186,7 @@ module Hobo
184
186
  return true if check_only
185
187
 
186
188
  def_scope do |str|
187
- @klass.where "#{column_sql(col)} LIKE ?", "%#{str}"
189
+ @klass.where "#{column_sql(col)} #{like_operator} ?", "%#{str}"
188
190
  end
189
191
 
190
192
  # name_does_not_end(str)
@@ -192,7 +194,7 @@ module Hobo
192
194
  return true if check_only
193
195
 
194
196
  def_scope do |str|
195
- @klass.where "#{column_sql(col)} NOT LIKE ?", "%#{str}"
197
+ @klass.where "#{column_sql(col)} NOT #{like_operator} ?", "%#{str}"
196
198
  end
197
199
 
198
200
  # published (a boolean column)
@@ -62,8 +62,7 @@ Redirect to the URI stored by the most recent store_location call or to the pass
62
62
  When called with before_filter, `login_from_cookie` will call `authenticated_user_from_cookie` to check for
63
63
  an `auth_token` cookie, and if the result is appropiate, it will log the user in.
64
64
 
65
-
66
-
65
+ See the [controller section in Users and Authentication](/manual/users_and_authentication#hobo_user_controller) for more information
67
66
 
68
67
  ## create_auth_cookie
69
68
 
@@ -71,6 +70,9 @@ Populates `cookies[:auth_token]` with `current_user` data.
71
70
 
72
71
 
73
72
 
73
+ See also the [Hobo User Controller section](/manual/users_and_authentication#hobo_user_controller) in the Users and Authentication manual.
74
+
75
+
74
76
  # Cache
75
77
 
76
78
  ## expire_swept_caches_for(obj, attr=nil)
@@ -84,6 +86,8 @@ Refer to the `<swept-cache>` taglib for more information.
84
86
 
85
87
  ## Introduction to the Hobo Model Controller Module
86
88
 
89
+ Adding `hobo_model_controller` to one of your controllers will include this module
90
+
87
91
  This module uses `def included(base)` to run some code in the context of the current controller. Some interesting stuff:
88
92
  * Defines @auto_actions as an empty hash if it's not already defined.
89
93
  * Runs `extend ClassMethods` to add the ClassMethods module to the current controller.
@@ -91,33 +95,72 @@ This module uses `def included(base)` to run some code in the context of the cur
91
95
  * Rescues from some errors: `ActiveRecord::RecordNotFound, ActiveRecord::RecordNotFound, Hobo::Model::Lifecycles::LifecycleKeyError`
92
96
  * Loads some subsite magic
93
97
 
94
- The rest of this section will talk about the ClassMethods added to the controller.
98
+ ## Class Methods
95
99
 
96
100
 
97
- ## model_name and model
101
+ ### model_name and model
98
102
 
99
103
  `model_name` returns `model.name.underscore`
100
104
 
101
105
  `model` returns `@model` or `controller_name.camelcase.singularize.constantize`
102
106
 
103
107
 
104
- ## autocomplete
108
+ ### autocomplete
109
+
110
+ This is the action called by the `<name-one>` tag to autocomplete results. See [Autocompleters](/manual/controllers#autocompleters) section in the controller manual.
111
+
112
+
113
+ ### web_method
114
+
115
+ See [Web methods](/manual/controllers#web_methods) in the Controller manual.
116
+
117
+
118
+
119
+ ### auto_actions
120
+
121
+ See [Selecting the automatic actions](/manual/controllers#selecting_the_automatic_actions) in the Controller manual.
122
+
123
+
124
+ ### def_lifecycle_actions
125
+
126
+ See [Lifecycles](/manual/controllers#lifecycles) in the Controller manual.
127
+
128
+
129
+ ## Instance Methods
130
+
131
+ ### find_instance
132
+
133
+ If your model is Foo, this method is equivalent to
134
+
135
+ Foo.find(params[:id])
136
+
137
+ in the simple case. However, it also understands owned routes and sets `acting_user`.
138
+
139
+ @foo = find_instance
140
+
141
+ is quite frequently the first line a custom Hobo controller action.
142
+
143
+
144
+ ### re_render_form
105
145
 
106
- This is the action called by the `<name-one>` tag to autocomplete results. See Autocompleters section in the controller manual.
146
+ If you have errors on your page, you can call this helper to re-render the view that contains the source form, with errors highlighted.
107
147
 
108
148
 
109
- ## web_method
149
+ ### destination_after_submit
110
150
 
111
- See `Web methods` sections in the Controller manual.
151
+ Contains the logic for [Automatic Redirects](/manual/controllers#automatic_redirects).
112
152
 
113
153
 
154
+ ### parse_sort_param
114
155
 
115
- ## auto_actions
156
+ Converts params[:sort] from the form used by `<table-plus>` into a form suitable to be passed to the [order_by](/manual/scopes#order_by) scope.
116
157
 
117
- See `Selecting the automatic actions` in the Controller manual.
158
+ Simple usage is to pass a list of field names, however the last parameter can be a hash which maps from field name to database column name.
118
159
 
160
+ parse_sort_param(:title, :isbn, :author => "authors.last_name")
119
161
 
162
+ `parse_sort_param` accepts dotted field names, automatically pluralizing to determine the database column.
120
163
 
121
- ## def_lifecycle_actions
164
+ Story.include(:tasks).order_by(parse_sort_param("task.title"))
122
165
 
123
- See Lifecycles section in the Controller manual.
166
+ will sort on `task.title` as long as :tasks is included or joined to the scope
@@ -28,7 +28,17 @@ Contents
28
28
 
29
29
  Using multi-model forms in Hobo is very straightforward:
30
30
 
31
- has_many :posts, :accessible => true
31
+ class Blog < ActiveRecord::Base
32
+ hobo_model
33
+ has_many :posts, :accessible => true, :inverse_of => :blog
34
+
35
+ class Post < ActiveRecord::Base
36
+ hobo_model
37
+ belongs_to :blog, :inverse_of => :posts
38
+
39
+ The `:accessible` flag is a Hobo addition, the `:inverse_of` flag is
40
+ standard Rails. `:inverse_of` is optional but highly recommended in
41
+ Rails; Hobo requires it.
32
42
 
33
43
  Once you've done that, the default forms that Hobo builds will use the
34
44
  [input-many](/api_tag_defs/input-many) tag.
@@ -243,8 +253,8 @@ large number of elements in the association.
243
253
 
244
254
  Both mechanisms are compatible and may be enabled simultaneously.
245
255
 
246
- It's certainly possible that Rapid >=1.1 will acquire tags that will
247
- require `accept_nested_attributes_for`. However, it's unlikely that
248
- Hobo will drop support for accessible associations unless ActiveRecord
249
- itself changes significantly.
256
+ It's certainly possible that later versions of Rapid will acquire tags
257
+ that will require `accept_nested_attributes_for`. However, it's
258
+ unlikely that Hobo will drop support for accessible associations
259
+ unless ActiveRecord itself changes significantly.
250
260
 
@@ -1,10 +1,10 @@
1
+ Hobo Scopes
2
+ {: .document-title}
3
+
1
4
  doctest: prepare testapp environment
2
5
  doctest_require: '../prepare_testapp'
3
6
  {.hidden}
4
7
 
5
- Hobo Scopes
6
- {: .document-title}
7
-
8
8
  Hobo scopes are an extension of the *named scope* and *dynamic finder*
9
9
  functionality introduced in Rails 2.1, 2.2 and 2.3.
10
10
 
@@ -75,8 +75,7 @@ Let's set up a few models for our testing:
75
75
  Generate a migration and run it:
76
76
  {.hidden}
77
77
 
78
- >> File.open("m.txt", "w") {|f| f.write("m\n\n")}
79
- >> system("rails g hobo:migration < m.txt")
78
+ >> system("rails g hobo:migration -m -n")
80
79
  >> ActionDispatch::Reloader.cleanup!
81
80
  >> ActionDispatch::Reloader.prepare!
82
81
  >> Person.connection.clear_cache!
@@ -135,21 +134,29 @@ But the Hobo scope form allows us to supply several variations
135
134
 
136
135
  ## \_contains
137
136
 
137
+ Case insensitive.
138
+
138
139
  >> Person.name_contains("y").*.name
139
140
  => ["Bryan", "Bethany"]
140
141
 
141
142
  ## \_does\_not\_contain
142
143
 
143
- >> Person.name_does_not_contain("B").*.name
144
+ Case insensitive.
145
+
146
+ >> Person.name_does_not_contain("b").*.name
144
147
  => []
145
148
 
146
149
  ## \_starts
147
150
 
148
- >> Person.name_starts("B").*.name
151
+ Case insensitive.
152
+
153
+ >> Person.name_starts("b").*.name
149
154
  => ["Bryan", "Bethany"]
150
155
 
151
156
  ## \_does\_not\_start
152
157
 
158
+ Case insensitive.
159
+
153
160
  >> Person.name_does_not_start("B").length
154
161
  => 0
155
162
 
metadata CHANGED
@@ -1,183 +1,177 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: hobo
3
- version: !ruby/object:Gem::Version
4
- version: 2.0.0.pre7
3
+ version: !ruby/object:Gem::Version
4
+ hash: -182171504
5
5
  prerelease: 6
6
+ segments:
7
+ - 2
8
+ - 0
9
+ - 0
10
+ - pre
11
+ - 8
12
+ version: 2.0.0.pre8
6
13
  platform: ruby
7
- authors:
14
+ authors:
8
15
  - Tom Locke
9
16
  autorequire:
10
17
  bindir: bin
11
18
  cert_chain: []
12
- date: 2012-12-06 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
19
+
20
+ date: 2013-02-04 00:00:00 Z
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
15
23
  name: hobo_support
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - '='
20
- - !ruby/object:Gem::Version
21
- version: 2.0.0.pre7
22
- type: :runtime
23
24
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
+ requirement: &id001 !ruby/object:Gem::Requirement
25
26
  none: false
26
- requirements:
27
- - - '='
28
- - !ruby/object:Gem::Version
29
- version: 2.0.0.pre7
30
- - !ruby/object:Gem::Dependency
31
- name: hobo_fields
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - '='
36
- - !ruby/object:Gem::Version
37
- version: 2.0.0.pre7
27
+ requirements:
28
+ - - "="
29
+ - !ruby/object:Gem::Version
30
+ hash: -182171504
31
+ segments:
32
+ - 2
33
+ - 0
34
+ - 0
35
+ - pre
36
+ - 8
37
+ version: 2.0.0.pre8
38
38
  type: :runtime
39
+ version_requirements: *id001
40
+ - !ruby/object:Gem::Dependency
41
+ name: hobo_fields
39
42
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
43
+ requirement: &id002 !ruby/object:Gem::Requirement
41
44
  none: false
42
- requirements:
43
- - - '='
44
- - !ruby/object:Gem::Version
45
- version: 2.0.0.pre7
46
- - !ruby/object:Gem::Dependency
47
- name: dryml
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - '='
52
- - !ruby/object:Gem::Version
53
- version: 2.0.0.pre7
45
+ requirements:
46
+ - - "="
47
+ - !ruby/object:Gem::Version
48
+ hash: -182171504
49
+ segments:
50
+ - 2
51
+ - 0
52
+ - 0
53
+ - pre
54
+ - 8
55
+ version: 2.0.0.pre8
54
56
  type: :runtime
57
+ version_requirements: *id002
58
+ - !ruby/object:Gem::Dependency
59
+ name: dryml
55
60
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
61
+ requirement: &id003 !ruby/object:Gem::Requirement
57
62
  none: false
58
- requirements:
59
- - - '='
60
- - !ruby/object:Gem::Version
61
- version: 2.0.0.pre7
62
- - !ruby/object:Gem::Dependency
63
- name: will_paginate
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ~>
68
- - !ruby/object:Gem::Version
69
- version: 3.0.0
63
+ requirements:
64
+ - - "="
65
+ - !ruby/object:Gem::Version
66
+ hash: -182171504
67
+ segments:
68
+ - 2
69
+ - 0
70
+ - 0
71
+ - pre
72
+ - 8
73
+ version: 2.0.0.pre8
70
74
  type: :runtime
75
+ version_requirements: *id003
76
+ - !ruby/object:Gem::Dependency
77
+ name: will_paginate
71
78
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
79
+ requirement: &id004 !ruby/object:Gem::Requirement
73
80
  none: false
74
- requirements:
81
+ requirements:
75
82
  - - ~>
76
- - !ruby/object:Gem::Version
83
+ - !ruby/object:Gem::Version
84
+ hash: 7
85
+ segments:
86
+ - 3
87
+ - 0
88
+ - 0
77
89
  version: 3.0.0
78
- - !ruby/object:Gem::Dependency
90
+ type: :runtime
91
+ version_requirements: *id004
92
+ - !ruby/object:Gem::Dependency
79
93
  name: rubydoctest
80
- requirement: !ruby/object:Gem::Requirement
81
- none: false
82
- requirements:
83
- - - ! '>='
84
- - !ruby/object:Gem::Version
85
- version: 1.1.3
86
- type: :development
87
94
  prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
95
+ requirement: &id005 !ruby/object:Gem::Requirement
89
96
  none: false
90
- requirements:
91
- - - ! '>='
92
- - !ruby/object:Gem::Version
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ hash: 21
101
+ segments:
102
+ - 1
103
+ - 1
104
+ - 3
93
105
  version: 1.1.3
94
- - !ruby/object:Gem::Dependency
95
- name: shoulda
96
- requirement: !ruby/object:Gem::Requirement
97
- none: false
98
- requirements:
99
- - - ! '>='
100
- - !ruby/object:Gem::Version
101
- version: '0'
102
106
  type: :development
107
+ version_requirements: *id005
108
+ - !ruby/object:Gem::Dependency
109
+ name: shoulda
103
110
  prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ! '>='
108
- - !ruby/object:Gem::Version
109
- version: '0'
110
- - !ruby/object:Gem::Dependency
111
- name: irt
112
- requirement: !ruby/object:Gem::Requirement
111
+ requirement: &id006 !ruby/object:Gem::Requirement
113
112
  none: false
114
- requirements:
115
- - - '='
116
- - !ruby/object:Gem::Version
117
- version: 1.2.11
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ hash: 3
117
+ segments:
118
+ - 0
119
+ version: "0"
118
120
  type: :development
121
+ version_requirements: *id006
122
+ - !ruby/object:Gem::Dependency
123
+ name: irt
119
124
  prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
125
+ requirement: &id007 !ruby/object:Gem::Requirement
121
126
  none: false
122
- requirements:
123
- - - '='
124
- - !ruby/object:Gem::Version
127
+ requirements:
128
+ - - "="
129
+ - !ruby/object:Gem::Version
130
+ hash: 9
131
+ segments:
132
+ - 1
133
+ - 2
134
+ - 11
125
135
  version: 1.2.11
126
- - !ruby/object:Gem::Dependency
127
- name: mocha
128
- requirement: !ruby/object:Gem::Requirement
129
- none: false
130
- requirements:
131
- - - ! '>='
132
- - !ruby/object:Gem::Version
133
- version: '0'
134
136
  type: :development
137
+ version_requirements: *id007
138
+ - !ruby/object:Gem::Dependency
139
+ name: mocha
135
140
  prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
141
+ requirement: &id008 !ruby/object:Gem::Requirement
137
142
  none: false
138
- requirements:
139
- - - ! '>='
140
- - !ruby/object:Gem::Version
141
- version: '0'
142
- - !ruby/object:Gem::Dependency
143
- name: sqlite3
144
- requirement: !ruby/object:Gem::Requirement
145
- none: false
146
- requirements:
147
- - - ! '>='
148
- - !ruby/object:Gem::Version
149
- version: '0'
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ hash: 3
147
+ segments:
148
+ - 0
149
+ version: "0"
150
150
  type: :development
151
- prerelease: false
152
- version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
- requirements:
155
- - - ! '>='
156
- - !ruby/object:Gem::Version
157
- version: '0'
158
- - !ruby/object:Gem::Dependency
151
+ version_requirements: *id008
152
+ - !ruby/object:Gem::Dependency
159
153
  name: yard
160
- requirement: !ruby/object:Gem::Requirement
161
- none: false
162
- requirements:
163
- - - ! '>='
164
- - !ruby/object:Gem::Version
165
- version: '0'
166
- type: :development
167
154
  prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
155
+ requirement: &id009 !ruby/object:Gem::Requirement
169
156
  none: false
170
- requirements:
171
- - - ! '>='
172
- - !ruby/object:Gem::Version
173
- version: '0'
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ hash: 3
161
+ segments:
162
+ - 0
163
+ version: "0"
164
+ type: :development
165
+ version_requirements: *id009
174
166
  description: The web app builder for Rails
175
167
  email: tom@tomlocke.com
176
- executables:
168
+ executables:
177
169
  - hobo
178
170
  extensions: []
171
+
179
172
  extra_rdoc_files: []
180
- files:
173
+
174
+ files:
181
175
  - CHANGES-1.1.txt
182
176
  - CHANGES-1.3.txt
183
177
  - CHANGES-1.4.txt
@@ -383,28 +377,39 @@ files:
383
377
  - test/permissions/test_permissions.rb
384
378
  homepage: http://hobocentral.net
385
379
  licenses: []
380
+
386
381
  post_install_message:
387
- rdoc_options:
382
+ rdoc_options:
388
383
  - --charset=UTF-8
389
- require_paths:
384
+ require_paths:
390
385
  - lib
391
- required_ruby_version: !ruby/object:Gem::Requirement
386
+ required_ruby_version: !ruby/object:Gem::Requirement
392
387
  none: false
393
- requirements:
394
- - - ! '>='
395
- - !ruby/object:Gem::Version
396
- version: '0'
397
- required_rubygems_version: !ruby/object:Gem::Requirement
388
+ requirements:
389
+ - - ">="
390
+ - !ruby/object:Gem::Version
391
+ hash: 3
392
+ segments:
393
+ - 0
394
+ version: "0"
395
+ required_rubygems_version: !ruby/object:Gem::Requirement
398
396
  none: false
399
- requirements:
400
- - - ! '>='
401
- - !ruby/object:Gem::Version
397
+ requirements:
398
+ - - ">="
399
+ - !ruby/object:Gem::Version
400
+ hash: 23
401
+ segments:
402
+ - 1
403
+ - 3
404
+ - 6
402
405
  version: 1.3.6
403
406
  requirements: []
407
+
404
408
  rubyforge_project: hobo
405
- rubygems_version: 1.8.24
409
+ rubygems_version: 1.8.25
406
410
  signing_key:
407
411
  specification_version: 3
408
412
  summary: The web app builder for Rails
409
413
  test_files: []
414
+
410
415
  has_rdoc: