hobo 2.0.0.pre6 → 2.0.0.pre7
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 +34 -17
- data/CHANGES-2.0.markdown +34 -17
- data/VERSION +1 -1
- data/app/helpers/hobo_route_helper.rb +5 -2
- data/lib/generators/hobo/i18n/templates/hobo.es.yml +35 -34
- data/lib/hobo/controller/model.rb +6 -6
- data/lib/hobo/extensions/enumerable.rb +7 -5
- data/lib/hobo/model.rb +0 -59
- data/lib/hobo/model/scopes/automatic_scopes.rb +2 -1
- data/lib/hobo/model/user_base.rb +1 -1
- data/test/doctest/hobo/controller.rdoctest +123 -0
- metadata +9 -8
data/CHANGES-1.4.txt
CHANGED
@@ -405,6 +405,12 @@ push-state works best in an HTML5 browser. It works in older browsers
|
|
405
405
|
such as IE8, IE9 or Firefox 3, but results in strange looking URL's. See
|
406
406
|
the README for History.js for more details on that behaviour.
|
407
407
|
|
408
|
+
### turbolinks support
|
409
|
+
|
410
|
+
[turbolinks](https://github.com/rails/turbolinks) provides capabilities similar to the push-state fragment Ajax described above. However, rather than updating fragments, it updates the entire page. This makes it slightly slower but does not require any code modification.
|
411
|
+
|
412
|
+
Turbolinks is not compatible with the [bottom-load-javascript](http://cookbook-1.4.hobocentral.net/manual/changes20#bottomloading_javascript) option.
|
413
|
+
|
408
414
|
### plugin generators
|
409
415
|
{.part}
|
410
416
|
|
@@ -496,6 +502,8 @@ Turning on bottom-load will prevent Rails from splitting front.js into
|
|
496
502
|
multiple files even if you enable config.assets.debug in your
|
497
503
|
environment.
|
498
504
|
|
505
|
+
bottom-load-javascript is incompatible with turbolinks.
|
506
|
+
|
499
507
|
### allowing errors in parts
|
500
508
|
{.todo}
|
501
509
|
|
@@ -506,9 +514,10 @@ This behaviour may now be overridden by using the 'errors-ok'
|
|
506
514
|
attribute on your form. (or formlet or whatever other tag initiates
|
507
515
|
the Ajax call).
|
508
516
|
|
509
|
-
The 'errors-ok' attribute is processed in update_response.
|
510
|
-
|
511
|
-
implementing this functionality yourself
|
517
|
+
The 'errors-ok' attribute is processed in update_response. If you
|
518
|
+
render or redirect inside a block to hobo_update you will be
|
519
|
+
responsible for implementing this functionality yourself, or calling
|
520
|
+
update_response to do it for you.
|
512
521
|
|
513
522
|
### AJAX file uploads
|
514
523
|
{.todo}
|
@@ -768,23 +777,13 @@ field is named "project.title", parse_sort_param will sort on the
|
|
768
777
|
column "projects.title".
|
769
778
|
|
770
779
|
### controller actions
|
771
|
-
{.
|
780
|
+
{.done}
|
772
781
|
|
773
782
|
Hobo no longer attempts to perform its part-based AJAX actions when
|
774
783
|
sent an xhr request. Instead, Hobo performs part-based AJAX when
|
775
784
|
params[:render] is set.
|
776
785
|
|
777
|
-
The signature for the function update_response and friends
|
778
|
-
|
779
|
-
def update
|
780
|
-
hobo_update do
|
781
|
-
if params[:foo]==17
|
782
|
-
render_my_way
|
783
|
-
else
|
784
|
-
update_response # let Hobo handle it all
|
785
|
-
end
|
786
|
-
end
|
787
|
-
end
|
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.
|
788
787
|
|
789
788
|
### default controller actions now use respond_with
|
790
789
|
|
@@ -798,6 +797,24 @@ Note that the JSON and XML interfaces will only use coarse grained
|
|
798
797
|
model-level permission checking rather than fine grained attribute
|
799
798
|
level permission checking.
|
800
799
|
|
800
|
+
### custom alternate formats
|
801
|
+
|
802
|
+
Hobo no longer executes an arity zero block passed to hobo controller actions inside of a respond_to block. This means that you can render formats other than html inside of an arity zero block.
|
803
|
+
|
804
|
+
hobo_show do
|
805
|
+
render something if request.format.pdf?
|
806
|
+
end
|
807
|
+
|
808
|
+
Any formats that you do not render or redirect inside the block will be handled by hobo_show via respond_with.
|
809
|
+
|
810
|
+
If your block has a parameter, the block continues to be executed inside of a respond_to.
|
811
|
+
|
812
|
+
hobo_show do |format|
|
813
|
+
format.pdf do { render something }
|
814
|
+
end
|
815
|
+
|
816
|
+
Because this is a respond_to block any formats you do not render will fall through and be handled by hobo_show's respond_with block.
|
817
|
+
|
801
818
|
### before-unload
|
802
819
|
{.check}
|
803
820
|
|
@@ -849,7 +866,7 @@ the change is one I could do myself...)
|
|
849
866
|
- https://github.com/tablatom/hobo/commit/e9460d336ef85388af859e5082763bfae0ad01f5
|
850
867
|
|
851
868
|
### controller changes
|
852
|
-
{.
|
869
|
+
{.done}
|
853
870
|
|
854
871
|
Due to limitations on Ajax file uploads, multipart forms are not sent with the proper Ajax headers. If your controller action may receive multipart forms, rather than using:
|
855
872
|
|
@@ -869,7 +886,7 @@ use
|
|
869
886
|
for more information see http://jquery.malsup.com/form/#file-upload
|
870
887
|
|
871
888
|
### hobo_ajax_response
|
872
|
-
{.
|
889
|
+
{.done}
|
873
890
|
|
874
891
|
the `hobo_ajax_response` function now has a different signature.
|
875
892
|
Standard usage doesn't supply any arguments to hobo_ajax_response.
|
data/CHANGES-2.0.markdown
CHANGED
@@ -405,6 +405,12 @@ push-state works best in an HTML5 browser. It works in older browsers
|
|
405
405
|
such as IE8, IE9 or Firefox 3, but results in strange looking URL's. See
|
406
406
|
the README for History.js for more details on that behaviour.
|
407
407
|
|
408
|
+
### turbolinks support
|
409
|
+
|
410
|
+
[turbolinks](https://github.com/rails/turbolinks) provides capabilities similar to the push-state fragment Ajax described above. However, rather than updating fragments, it updates the entire page. This makes it slightly slower but does not require any code modification.
|
411
|
+
|
412
|
+
Turbolinks is not compatible with the [bottom-load-javascript](http://cookbook-1.4.hobocentral.net/manual/changes20#bottomloading_javascript) option.
|
413
|
+
|
408
414
|
### plugin generators
|
409
415
|
{.part}
|
410
416
|
|
@@ -496,6 +502,8 @@ Turning on bottom-load will prevent Rails from splitting front.js into
|
|
496
502
|
multiple files even if you enable config.assets.debug in your
|
497
503
|
environment.
|
498
504
|
|
505
|
+
bottom-load-javascript is incompatible with turbolinks.
|
506
|
+
|
499
507
|
### allowing errors in parts
|
500
508
|
{.todo}
|
501
509
|
|
@@ -506,9 +514,10 @@ This behaviour may now be overridden by using the 'errors-ok'
|
|
506
514
|
attribute on your form. (or formlet or whatever other tag initiates
|
507
515
|
the Ajax call).
|
508
516
|
|
509
|
-
The 'errors-ok' attribute is processed in update_response.
|
510
|
-
|
511
|
-
implementing this functionality yourself
|
517
|
+
The 'errors-ok' attribute is processed in update_response. If you
|
518
|
+
render or redirect inside a block to hobo_update you will be
|
519
|
+
responsible for implementing this functionality yourself, or calling
|
520
|
+
update_response to do it for you.
|
512
521
|
|
513
522
|
### AJAX file uploads
|
514
523
|
{.todo}
|
@@ -768,23 +777,13 @@ field is named "project.title", parse_sort_param will sort on the
|
|
768
777
|
column "projects.title".
|
769
778
|
|
770
779
|
### controller actions
|
771
|
-
{.
|
780
|
+
{.done}
|
772
781
|
|
773
782
|
Hobo no longer attempts to perform its part-based AJAX actions when
|
774
783
|
sent an xhr request. Instead, Hobo performs part-based AJAX when
|
775
784
|
params[:render] is set.
|
776
785
|
|
777
|
-
The signature for the function update_response and friends
|
778
|
-
|
779
|
-
def update
|
780
|
-
hobo_update do
|
781
|
-
if params[:foo]==17
|
782
|
-
render_my_way
|
783
|
-
else
|
784
|
-
update_response # let Hobo handle it all
|
785
|
-
end
|
786
|
-
end
|
787
|
-
end
|
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.
|
788
787
|
|
789
788
|
### default controller actions now use respond_with
|
790
789
|
|
@@ -798,6 +797,24 @@ Note that the JSON and XML interfaces will only use coarse grained
|
|
798
797
|
model-level permission checking rather than fine grained attribute
|
799
798
|
level permission checking.
|
800
799
|
|
800
|
+
### custom alternate formats
|
801
|
+
|
802
|
+
Hobo no longer executes an arity zero block passed to hobo controller actions inside of a respond_to block. This means that you can render formats other than html inside of an arity zero block.
|
803
|
+
|
804
|
+
hobo_show do
|
805
|
+
render something if request.format.pdf?
|
806
|
+
end
|
807
|
+
|
808
|
+
Any formats that you do not render or redirect inside the block will be handled by hobo_show via respond_with.
|
809
|
+
|
810
|
+
If your block has a parameter, the block continues to be executed inside of a respond_to.
|
811
|
+
|
812
|
+
hobo_show do |format|
|
813
|
+
format.pdf do { render something }
|
814
|
+
end
|
815
|
+
|
816
|
+
Because this is a respond_to block any formats you do not render will fall through and be handled by hobo_show's respond_with block.
|
817
|
+
|
801
818
|
### before-unload
|
802
819
|
{.check}
|
803
820
|
|
@@ -849,7 +866,7 @@ the change is one I could do myself...)
|
|
849
866
|
- https://github.com/tablatom/hobo/commit/e9460d336ef85388af859e5082763bfae0ad01f5
|
850
867
|
|
851
868
|
### controller changes
|
852
|
-
{.
|
869
|
+
{.done}
|
853
870
|
|
854
871
|
Due to limitations on Ajax file uploads, multipart forms are not sent with the proper Ajax headers. If your controller action may receive multipart forms, rather than using:
|
855
872
|
|
@@ -869,7 +886,7 @@ use
|
|
869
886
|
for more information see http://jquery.malsup.com/form/#file-upload
|
870
887
|
|
871
888
|
### hobo_ajax_response
|
872
|
-
{.
|
889
|
+
{.done}
|
873
890
|
|
874
891
|
the `hobo_ajax_response` function now has a different signature.
|
875
892
|
Standard usage doesn't supply any arguments to hobo_ajax_response.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.0.
|
1
|
+
2.0.0.pre7
|
@@ -123,11 +123,14 @@ module HoboRouteHelper
|
|
123
123
|
poly = [options[:subsite]] + poly if options[:subsite]
|
124
124
|
|
125
125
|
begin
|
126
|
-
url = polymorphic_path(poly, params)
|
126
|
+
base_url = url = polymorphic_path(poly, params)
|
127
127
|
# validate URL, since polymorphic URL may return a URL for a
|
128
128
|
# different method
|
129
129
|
# use starts_with because recognize path may return new_for_owner, for example
|
130
|
-
|
130
|
+
if Rails.application.config.action_controller.relative_url_root
|
131
|
+
base_url = url.gsub(/^#{Rails.application.config.action_controller.relative_url_root}/, "")
|
132
|
+
end
|
133
|
+
recognized_params = Rails.application.routes.recognize_path(base_url, {:method => options[:method]})
|
131
134
|
if recognized_params[:action] == action.to_s
|
132
135
|
url
|
133
136
|
else
|
@@ -12,7 +12,7 @@ es:
|
|
12
12
|
index:
|
13
13
|
# if you uncomment the following you will loose the automatic selection of dinamically pluralized nav-tabs
|
14
14
|
# if you need a different title you should implement a different way to select the tab on your own
|
15
|
-
#title: "
|
15
|
+
#title: "Índice %{model}"
|
16
16
|
heading: "Índice %{model}"
|
17
17
|
|
18
18
|
new:
|
@@ -24,7 +24,7 @@ es:
|
|
24
24
|
heading: "%{model} %{name}"
|
25
25
|
back_link: "Atrás"
|
26
26
|
edit_link: "Actualizar %{model}"
|
27
|
-
new_link: "Nuevo
|
27
|
+
new_link: "Nuevo registro %{model}"
|
28
28
|
add_form_heading: "Añadir %{model}"
|
29
29
|
|
30
30
|
edit:
|
@@ -41,56 +41,57 @@ es:
|
|
41
41
|
subheading: "Para:"
|
42
42
|
|
43
43
|
new_for_owner:
|
44
|
-
title: "Nuevo
|
45
|
-
heading: "Nuevo
|
44
|
+
title: "Nuevo registro de %{model} para"
|
45
|
+
heading: "Nuevo registro de %{model}"
|
46
46
|
subheading: "Para:"
|
47
47
|
|
48
48
|
login:
|
49
|
-
title: "Iniciar
|
50
|
-
heading: "Iniciar
|
51
|
-
email_address: &email_address "Correo
|
49
|
+
title: "Iniciar sesión"
|
50
|
+
heading: "Iniciar sesión"
|
51
|
+
email_address: &email_address "Correo eléctronico"
|
52
52
|
name: "Nombre"
|
53
53
|
password: "Contraseña"
|
54
54
|
remember_me: "Recuerda mis datos"
|
55
55
|
login: "Identificación"
|
56
|
-
signup: "
|
56
|
+
signup: "Registro"
|
57
57
|
forgot_password: &forgot_password "¿Contraseña olvidada?"
|
58
58
|
|
59
59
|
signup:
|
60
|
-
title: "
|
61
|
-
heading: "
|
60
|
+
title: "Registro"
|
61
|
+
heading: "Registrar nuevo usuario"
|
62
62
|
|
63
63
|
forgot_password:
|
64
64
|
title: *forgot_password
|
65
65
|
heading: *forgot_password
|
66
|
-
text: "
|
67
|
-
|
66
|
+
text: "Introduzca la dirección de correo electrónico mediante la cual se registró. Le enviaremos un correo con instrucciones para generar una nueva contraseña."
|
67
|
+
|
68
|
+
|
68
69
|
email_address: *email_address
|
69
|
-
send: "Enviar"
|
70
|
+
send: "Enviar nueva contraseña"
|
70
71
|
|
71
72
|
forgot_password_sent:
|
72
|
-
title: "Contraseña olvidada - Correo
|
73
|
-
heading: "Contraseña olvidada - Correo
|
73
|
+
title: "Contraseña olvidada - Correo eléctronico enviado"
|
74
|
+
heading: "Contraseña olvidada - Correo eléctronico enviado"
|
74
75
|
text: "El mensaje con las instrucciones para generar una nueva contraseña ha sido enviado a %{email_address}
|
75
76
|
Si no lo recibe, por favor verifique el filtro anti-spam."
|
76
77
|
|
77
78
|
account_disabled_page:
|
78
|
-
title: "Cuenta
|
79
|
-
heading: "Cuenta
|
80
|
-
text: "Su cuenta está desactivada en
|
79
|
+
title: "Cuenta desactivada"
|
80
|
+
heading: "Cuenta desactivada"
|
81
|
+
text: "Su cuenta está desactivada en este momento."
|
81
82
|
|
82
83
|
account_page:
|
83
|
-
title: "Tu
|
84
|
-
heading: "Tu
|
85
|
-
new_password: "Nueva
|
86
|
-
confirm_new_password: "Confirmación
|
84
|
+
title: "Tu perfil"
|
85
|
+
heading: "Tu perfil"
|
86
|
+
new_password: "Nueva contraseña"
|
87
|
+
confirm_new_password: "Confirmación nueva contraseña"
|
87
88
|
|
88
89
|
# default hobo action translation
|
89
90
|
actions:
|
90
|
-
new: "Nuevo
|
91
|
+
new: "Nuevo registro de %{model}"
|
91
92
|
create: "Crear %{model}"
|
92
|
-
previous: "
|
93
|
-
next: "
|
93
|
+
previous: "Anterior"
|
94
|
+
next: "Siguiente"
|
94
95
|
add: "Añadir"
|
95
96
|
show_all: "Muestra todos %{model}..."
|
96
97
|
delete: "Borrar %{model}"
|
@@ -102,12 +103,12 @@ es:
|
|
102
103
|
back_to_parent: "Volver a %{parent} %{name}"
|
103
104
|
send: "Enviar"
|
104
105
|
remove: "Eliminar"
|
105
|
-
signup: "
|
106
|
+
signup: "Registro"
|
106
107
|
login: "Iniciar Sesión"
|
107
108
|
logout: "Terminar Sesión"
|
108
109
|
logged_in_as: "%{name}"
|
109
110
|
account: "Perfil"
|
110
|
-
save_account: "Guarda
|
111
|
+
save_account: "Guarda tu perfil"
|
111
112
|
|
112
113
|
# default hobo message translation
|
113
114
|
messages:
|
@@ -119,16 +120,16 @@ es:
|
|
119
120
|
transition:
|
120
121
|
error: "La transición %{name} no se pudo ejecutar.\n%{errors}"
|
121
122
|
update:
|
122
|
-
no_attribute_error: "Ninguna actualización
|
123
|
+
no_attribute_error: "Ninguna actualización está especificada en los parámetros"
|
123
124
|
success: "Los cambios a %{model} han sido guardados"
|
124
125
|
error: "Ha habido un problema con ese cambio.\n%{errors}"
|
125
126
|
destroy:
|
126
|
-
success: "La
|
127
|
+
success: "La eliminación de %{model} ha sido tenido éxito."
|
127
128
|
signup:
|
128
|
-
success: "¡Gracias por
|
129
|
+
success: "¡Gracias por registrarte!"
|
129
130
|
must_activate: "Tiene que activar la cuenta antes de iniciar la sesión. Por favor verifique su correo eléctronico."
|
130
131
|
login:
|
131
|
-
success: "
|
132
|
+
success: "Ha iniciado la sesión."
|
132
133
|
error: "¡No se ingresaron %{login} y Contraseña válidos!"
|
133
134
|
logout: "La sesión ha terminado."
|
134
135
|
reset_password: "Tu contraseña ha sido reiniciada."
|
@@ -138,7 +139,7 @@ es:
|
|
138
139
|
validate_password: "debe contener al menos 6 caracteres, letras mayúsculas y minúsculas"
|
139
140
|
current_password_is_not_correct: "no está correcta"
|
140
141
|
you_are_site_admin: "Ahora usted es el administrador del sitio."
|
141
|
-
you_signed_up: "Usted se
|
142
|
+
you_signed_up: "Usted se registró."
|
142
143
|
none: "No hay %{model} disponibles."
|
143
144
|
confirm: "¿Está seguro?"
|
144
145
|
|
@@ -159,7 +160,7 @@ es:
|
|
159
160
|
# default hobo form translation
|
160
161
|
form:
|
161
162
|
new:
|
162
|
-
heading: "Nuevo
|
163
|
+
heading: "Nuevo registro de %{model}"
|
163
164
|
error:
|
164
165
|
heading: "Ocurrió el siguiente error:"
|
165
166
|
select_many:
|
@@ -186,7 +187,7 @@ es:
|
|
186
187
|
|
187
188
|
admin:
|
188
189
|
subsite_name: "Administración"
|
189
|
-
invite_new_user: "Invitar
|
190
|
+
invite_new_user: "Invitar nuevo usuario"
|
190
191
|
|
191
192
|
subsite:
|
192
193
|
back_link: "Sitio Principal"
|
@@ -429,12 +429,12 @@ module Hobo
|
|
429
429
|
|
430
430
|
def response_block(&b)
|
431
431
|
if b
|
432
|
-
|
433
|
-
|
432
|
+
if b.arity == 1
|
433
|
+
respond_to do |format|
|
434
434
|
yield format
|
435
|
-
else
|
436
|
-
format.html { yield }
|
437
435
|
end
|
436
|
+
else
|
437
|
+
yield
|
438
438
|
end
|
439
439
|
performed?
|
440
440
|
end
|
@@ -511,7 +511,7 @@ module Hobo
|
|
511
511
|
end
|
512
512
|
|
513
513
|
def hobo_new(record=nil, &b)
|
514
|
-
self.this
|
514
|
+
self.this ||= record || model.user_new(current_user, attribute_parameters)
|
515
515
|
response_block(&b) || show_response
|
516
516
|
end
|
517
517
|
|
@@ -535,7 +535,7 @@ module Hobo
|
|
535
535
|
|
536
536
|
def hobo_new_for(owner, record=nil, &b)
|
537
537
|
owner, association = find_owner_and_association(owner)
|
538
|
-
self.this
|
538
|
+
self.this ||= record || association.user_new(current_user, attribute_parameters)
|
539
539
|
response_block(&b) || show_response
|
540
540
|
end
|
541
541
|
|
@@ -1,12 +1,14 @@
|
|
1
1
|
module Enumerable
|
2
2
|
def group_by_with_metadata(&block)
|
3
3
|
r=group_by_without_metadata(&block)
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
if respond_to?(:origin)
|
5
|
+
r.each do |k,v|
|
6
|
+
v.origin = origin
|
7
|
+
v.origin_attribute = origin_attribute
|
8
|
+
v.member_class = member_class
|
9
|
+
end
|
8
10
|
end
|
9
11
|
r
|
10
12
|
end
|
11
13
|
alias_method_chain :group_by, :metadata
|
12
|
-
end
|
14
|
+
end
|
data/lib/hobo/model.rb
CHANGED
@@ -17,7 +17,6 @@ module Hobo
|
|
17
17
|
|
18
18
|
base.class_eval do
|
19
19
|
inheriting_cattr_reader :default_order
|
20
|
-
alias_method_chain :attributes=, :hobo_type_conversion
|
21
20
|
|
22
21
|
cattr_accessor :hobo_controller
|
23
22
|
self.hobo_controller = {}
|
@@ -356,17 +355,6 @@ module Hobo
|
|
356
355
|
end
|
357
356
|
|
358
357
|
|
359
|
-
def attributes_with_hobo_type_conversion=(attributes, guard_protected_attributes=true)
|
360
|
-
converted = attributes.map_hash { |k, v| convert_type_for_mass_assignment(self.class.attr_type(k), v) }
|
361
|
-
# Avoid passing this third argument if possible, to avoid a deprecation warning in Rails 3.1
|
362
|
-
if guard_protected_attributes
|
363
|
-
send(:attributes_without_hobo_type_conversion=, converted)
|
364
|
-
else
|
365
|
-
send(:attributes_without_hobo_type_conversion=, converted, true)
|
366
|
-
end
|
367
|
-
end
|
368
|
-
|
369
|
-
|
370
358
|
# We deliberately give these three methods unconventional (java-esque) names to avoid
|
371
359
|
# polluting the application namespace
|
372
360
|
|
@@ -412,53 +400,6 @@ module Hobo
|
|
412
400
|
"#{self.class.model_name.human} #{id}"
|
413
401
|
end
|
414
402
|
end
|
415
|
-
|
416
|
-
|
417
|
-
private
|
418
|
-
|
419
|
-
|
420
|
-
def convert_type_for_mass_assignment(field_type, value)
|
421
|
-
if !field_type.is_a?(Class)
|
422
|
-
value
|
423
|
-
|
424
|
-
elsif field_type <= Date
|
425
|
-
if value.is_a? Hash
|
426
|
-
parts = %w{year month day}.map{|s| value[s].to_i}
|
427
|
-
if parts.include?(0)
|
428
|
-
nil
|
429
|
-
else
|
430
|
-
begin
|
431
|
-
Date.new(*parts)
|
432
|
-
rescue ArgumentError => ex
|
433
|
-
Time.time_with_datetime_fallback(ActiveRecord::Base.default_timezone, *parts).to_date
|
434
|
-
end
|
435
|
-
end
|
436
|
-
else
|
437
|
-
value
|
438
|
-
end
|
439
|
-
|
440
|
-
elsif field_type <= Time || field_type <= ActiveSupport::TimeWithZone
|
441
|
-
if value.is_a? Hash
|
442
|
-
parts = %w{year month day hour minute second}.map{|s| value[s].to_i}
|
443
|
-
if parts[0..2].include?(0)
|
444
|
-
nil
|
445
|
-
else
|
446
|
-
field_type <= Time ? Time.utc(*parts) : Time.zone.local(*parts)
|
447
|
-
end
|
448
|
-
else
|
449
|
-
value
|
450
|
-
end
|
451
|
-
|
452
|
-
elsif field_type <= Hobo::Boolean
|
453
|
-
(value.is_a?(String) && value.strip.downcase.in?(['0', 'false']) || value.blank?) ? false : true
|
454
|
-
|
455
|
-
else
|
456
|
-
# no conversion
|
457
|
-
value
|
458
|
-
end
|
459
|
-
end
|
460
|
-
|
461
|
-
|
462
403
|
end
|
463
404
|
|
464
405
|
end
|
@@ -293,6 +293,7 @@ module Hobo
|
|
293
293
|
klass = @klass
|
294
294
|
def_scope do |*args|
|
295
295
|
field, asc = args
|
296
|
+
field ||= ""
|
296
297
|
type = klass.attr_type(field)
|
297
298
|
if type.nil? #a virtual attribute from an SQL alias, e.g., 'total' from 'COUNT(*) AS total'
|
298
299
|
colspec = "#{field}" # don't prepend the table name
|
@@ -321,7 +322,7 @@ module Hobo
|
|
321
322
|
def_scope do |query, *fields|
|
322
323
|
match_keyword = %w(PostgreSQL PostGIS).include?(::ActiveRecord::Base.connection.adapter_name) ? "ILIKE" : "LIKE"
|
323
324
|
|
324
|
-
words = query.split
|
325
|
+
words = (query || "").split
|
325
326
|
args = []
|
326
327
|
word_queries = words.map do |word|
|
327
328
|
field_query = '(' + fields.map { |field|
|
data/lib/hobo/model/user_base.rb
CHANGED
@@ -0,0 +1,123 @@
|
|
1
|
+
Hobo's Miscellaneous Controller Extensions
|
2
|
+
{.document-title}
|
3
|
+
|
4
|
+
This chapter of the Hobo Manual describes Hobo's controller extensions.
|
5
|
+
|
6
|
+
Contents
|
7
|
+
{.contents-heading}
|
8
|
+
|
9
|
+
- contents
|
10
|
+
{:toc}
|
11
|
+
|
12
|
+
doctest: prepare testapp environment
|
13
|
+
doctest_require: '../prepare_testapp'
|
14
|
+
{.hidden}
|
15
|
+
|
16
|
+
# Authentication support
|
17
|
+
|
18
|
+
## authorized?
|
19
|
+
|
20
|
+
This method checks if the user is authorized. It returns true by default. Override this method in your controllers if you want to restrict access to only a few actions or if you want to check if the user has the correct rights.
|
21
|
+
|
22
|
+
Example:
|
23
|
+
|
24
|
+
# only allow nonbobs
|
25
|
+
def authorized?
|
26
|
+
current_user.login != "bob"
|
27
|
+
end
|
28
|
+
|
29
|
+
## login_required
|
30
|
+
|
31
|
+
This is used as a filter to control authentication.
|
32
|
+
|
33
|
+
To require logins for all actions, use this in your controllers:
|
34
|
+
|
35
|
+
before_filter :login_required
|
36
|
+
|
37
|
+
To require logins for specific actions, use this in your controllers:
|
38
|
+
|
39
|
+
before_filter :login_required, :only => [ :edit, :update ]
|
40
|
+
|
41
|
+
To skip this in a subclassed controller:
|
42
|
+
|
43
|
+
skip_before_filter :login_required
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
## store_location
|
48
|
+
|
49
|
+
Store the URI of the current request in the session. We can return to this location by calling #redirect_back_or_default.
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
## redirect_back_or_default(default)
|
54
|
+
|
55
|
+
Redirect to the URI stored by the most recent store_location call or to the passed default.
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
## login_from_cookie and authenticated_user_from_cookie
|
61
|
+
|
62
|
+
When called with before_filter, `login_from_cookie` will call `authenticated_user_from_cookie` to check for
|
63
|
+
an `auth_token` cookie, and if the result is appropiate, it will log the user in.
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
|
68
|
+
## create_auth_cookie
|
69
|
+
|
70
|
+
Populates `cookies[:auth_token]` with `current_user` data.
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
# Cache
|
75
|
+
|
76
|
+
## expire_swept_caches_for(obj, attr=nil)
|
77
|
+
|
78
|
+
This method is to be used in the controller as a partner to the `<swept-cache>` tag.
|
79
|
+
Refer to the `<swept-cache>` taglib for more information.
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
# Model
|
84
|
+
|
85
|
+
## Introduction to the Hobo Model Controller Module
|
86
|
+
|
87
|
+
This module uses `def included(base)` to run some code in the context of the current controller. Some interesting stuff:
|
88
|
+
* Defines @auto_actions as an empty hash if it's not already defined.
|
89
|
+
* Runs `extend ClassMethods` to add the ClassMethods module to the current controller.
|
90
|
+
* Adds a couple of helpers: `:model, :current_user`
|
91
|
+
* Rescues from some errors: `ActiveRecord::RecordNotFound, ActiveRecord::RecordNotFound, Hobo::Model::Lifecycles::LifecycleKeyError`
|
92
|
+
* Loads some subsite magic
|
93
|
+
|
94
|
+
The rest of this section will talk about the ClassMethods added to the controller.
|
95
|
+
|
96
|
+
|
97
|
+
## model_name and model
|
98
|
+
|
99
|
+
`model_name` returns `model.name.underscore`
|
100
|
+
|
101
|
+
`model` returns `@model` or `controller_name.camelcase.singularize.constantize`
|
102
|
+
|
103
|
+
|
104
|
+
## autocomplete
|
105
|
+
|
106
|
+
This is the action called by the `<name-one>` tag to autocomplete results. See Autocompleters section in the controller manual.
|
107
|
+
|
108
|
+
|
109
|
+
## web_method
|
110
|
+
|
111
|
+
See `Web methods` sections in the Controller manual.
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
## auto_actions
|
116
|
+
|
117
|
+
See `Selecting the automatic actions` in the Controller manual.
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
## def_lifecycle_actions
|
122
|
+
|
123
|
+
See Lifecycles section in the Controller manual.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hobo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.pre7
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: hobo_support
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - '='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 2.0.0.
|
21
|
+
version: 2.0.0.pre7
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - '='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 2.0.0.
|
29
|
+
version: 2.0.0.pre7
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: hobo_fields
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
requirements:
|
35
35
|
- - '='
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: 2.0.0.
|
37
|
+
version: 2.0.0.pre7
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +42,7 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - '='
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 2.0.0.
|
45
|
+
version: 2.0.0.pre7
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: dryml
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - '='
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 2.0.0.
|
53
|
+
version: 2.0.0.pre7
|
54
54
|
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,7 +58,7 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 2.0.0.
|
61
|
+
version: 2.0.0.pre7
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: will_paginate
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -345,6 +345,7 @@ files:
|
|
345
345
|
- lib/hobo/rapid/taglibs/rapid.dryml
|
346
346
|
- lib/hobo/routes.rb
|
347
347
|
- lib/hobo/undefined.rb
|
348
|
+
- test/doctest/hobo/controller.rdoctest
|
348
349
|
- test/doctest/hobo/hobo_helper.rdoctest
|
349
350
|
- test/doctest/hobo/lifecycles.rdoctest
|
350
351
|
- test/doctest/hobo/model.rdoctest
|