hobo 2.0.0.pre7 → 2.0.0.pre8

Sign up to get free protection for your applications and to get access to all the features.
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: