formula 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (155) hide show
  1. data/LICENSE +1 -1
  2. data/README.rdoc +6 -6
  3. data/lib/formula.rb +143 -143
  4. data/lib/formula/railtie.rb +1 -1
  5. data/lib/formula/version.rb +1 -1
  6. data/lib/generators/attached/templates/_form.html.haml +6 -0
  7. data/test/dummy/app/assets/javascripts/application.js +2 -1
  8. data/test/dummy/app/assets/javascripts/{contacts.js → main.js.coffee} +0 -0
  9. data/test/dummy/app/assets/stylesheets/application.css +4 -168
  10. data/test/dummy/app/assets/stylesheets/main.css.scss +6 -0
  11. data/test/dummy/app/controllers/application_controller.rb +56 -0
  12. data/test/dummy/app/controllers/contacts_controller.rb +15 -8
  13. data/test/dummy/app/controllers/main_controller.rb +2 -2
  14. data/test/dummy/app/controllers/sessions_controller.rb +37 -0
  15. data/test/dummy/app/controllers/users_controller.rb +46 -0
  16. data/test/dummy/app/helpers/sessions_helper.rb +2 -0
  17. data/test/dummy/app/helpers/users_helper.rb +2 -0
  18. data/test/dummy/app/models/contact.rb +6 -6
  19. data/test/dummy/app/models/group.rb +3 -3
  20. data/test/dummy/app/models/session.rb +39 -0
  21. data/test/dummy/app/models/user.rb +19 -0
  22. data/test/dummy/app/views/contacts/_form.html.haml +12 -0
  23. data/test/dummy/app/views/contacts/edit.html.haml +6 -0
  24. data/test/dummy/app/views/contacts/index.html.haml +21 -0
  25. data/test/dummy/app/views/contacts/new.html.haml +6 -0
  26. data/test/dummy/app/views/layouts/application.html.haml +23 -0
  27. data/test/dummy/app/views/main/index.html.haml +7 -0
  28. data/test/dummy/app/views/sessions/_fields.html.haml +3 -0
  29. data/test/dummy/app/views/sessions/_form.html.haml +5 -0
  30. data/test/dummy/app/views/sessions/_modal.html.haml +12 -0
  31. data/test/dummy/app/views/sessions/new.html.haml +5 -0
  32. data/test/dummy/app/views/sessions/new.js.haml +2 -0
  33. data/test/dummy/app/views/users/_fields.html.haml +4 -0
  34. data/test/dummy/app/views/users/_form.html.haml +5 -0
  35. data/test/dummy/app/views/users/_modal.html.haml +12 -0
  36. data/test/dummy/app/views/users/edit.html.haml +6 -0
  37. data/test/dummy/app/views/users/edit.js.haml +2 -0
  38. data/test/dummy/app/views/users/new.html.haml +6 -0
  39. data/test/dummy/app/views/users/new.js.haml +2 -0
  40. data/test/dummy/config/initializers/formula.rb +9 -0
  41. data/test/dummy/config/routes.rb +5 -3
  42. data/test/dummy/db/development.sqlite3 +0 -0
  43. data/test/dummy/db/migrate/20110109175811_create_contacts.rb +3 -3
  44. data/test/dummy/db/migrate/20120226213733_create_users.rb +11 -0
  45. data/test/dummy/db/schema.rb +9 -1
  46. data/test/dummy/db/test.sqlite3 +0 -0
  47. data/test/dummy/log/development.log +517 -8877
  48. data/test/dummy/log/test.log +125 -1276
  49. data/test/dummy/test/fixtures/users.yml +11 -0
  50. data/test/dummy/test/functional/sessions_controller_test.rb +7 -0
  51. data/test/dummy/test/functional/users_controller_test.rb +7 -0
  52. data/test/dummy/test/unit/helpers/sessions_helper_test.rb +4 -0
  53. data/test/dummy/test/unit/helpers/users_helper_test.rb +4 -0
  54. data/test/dummy/test/unit/user_test.rb +4 -0
  55. data/test/dummy/tmp/cache/assets/C78/B50/sprockets%2F50c7787472c6f1d292b210d9089ab021 +0 -0
  56. data/test/dummy/tmp/cache/assets/CA7/750/sprockets%2F26520da197942c10bb08b879dd27a335 +0 -0
  57. data/test/dummy/tmp/cache/assets/CB7/2E0/sprockets%2F122b94d05b802dec569597f372446e3e +0 -0
  58. data/test/dummy/tmp/cache/assets/CB9/500/sprockets%2Ff73079569d09e1dbf3d2610999b612d0 +0 -0
  59. data/test/dummy/tmp/cache/assets/{CFB/150/sprockets%2Ff5209763c82e66ecdff0f9583166f557 → CB9/B60/sprockets%2Fe7b839a0806e5c20e5018197f56cd656} +0 -0
  60. data/test/dummy/tmp/cache/assets/CBB/9B0/sprockets%2Fb718278187c3db586a420ec889c2950b +0 -0
  61. data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  62. data/test/dummy/tmp/cache/assets/CDA/AB0/sprockets%2F4c7fc412b88cba24c365e12622902d79 +0 -0
  63. data/test/dummy/tmp/cache/assets/CDE/810/sprockets%2Fe9a718cd714105529e1126df281d5b9b +0 -0
  64. data/test/dummy/tmp/cache/assets/CDF/F20/sprockets%2Fafb369756d4161e56d25623705a1e4cf +0 -0
  65. data/test/dummy/tmp/cache/assets/D02/B20/sprockets%2F8424bdf2fc431411608e3a8ad4b12d77 +0 -0
  66. data/test/dummy/tmp/cache/assets/D07/020/sprockets%2F48a47b7a23025cf73408c7eb161fac38 +0 -0
  67. data/test/dummy/tmp/cache/assets/D11/7D0/sprockets%2F3eb85317d2ba89b1dd70fa28790a5943 +0 -0
  68. data/test/dummy/tmp/cache/assets/D1E/300/sprockets%2Fccb7b47689ba77b4d03c884f375b9154 +0 -0
  69. data/test/dummy/tmp/cache/assets/D2B/FC0/sprockets%2F90966edb48c329529d676f9a992db3da +0 -0
  70. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  71. data/test/dummy/tmp/cache/assets/D3E/520/sprockets%2F0c368fc7951f5ee15b407bf530a5df25 +0 -0
  72. data/test/dummy/tmp/cache/assets/D48/6E0/sprockets%2Fee6b9dc867c5bc23c4c70f38549b2371 +0 -0
  73. data/test/dummy/tmp/cache/assets/D4A/E30/sprockets%2F058c4112a2f16c6d9a8499fffa24e6f7 +0 -0
  74. data/test/dummy/tmp/cache/assets/D4E/110/sprockets%2Fd604658b4f6b260ccdc967ed53b9926e +0 -0
  75. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  76. data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  77. data/test/dummy/tmp/cache/assets/D62/170/sprockets%2F75a5cc23ce1b2511be2ff95407e62d1e +0 -0
  78. data/test/dummy/tmp/cache/assets/D6C/090/sprockets%2F51b52949eefd109c700dc0ad8bd96d42 +0 -0
  79. data/test/dummy/tmp/cache/assets/D6C/210/sprockets%2Fc38fd401489a552f8716adf4aedaa325 +0 -0
  80. data/test/dummy/tmp/cache/assets/D6E/060/sprockets%2Fc0f3f19ea49926baf1623d4e12bc8f64 +0 -0
  81. data/test/dummy/tmp/cache/assets/{D2F/290/sprockets%2Fd5c244ec777cb5719f86d085df9f8816 → D76/4D0/sprockets%2F8a096b6dd59bfda3e461617a95524eaf} +0 -0
  82. data/test/dummy/tmp/cache/assets/D7B/CF0/sprockets%2Fd500cd67c78fa2fc96993e6cdd3050f6 +0 -0
  83. data/test/dummy/tmp/cache/assets/D93/910/sprockets%2Fb3f07cff0c2b5450dff46b72d29ec320 +0 -0
  84. data/test/dummy/tmp/cache/assets/D9B/350/sprockets%2Fb77ea162d3f4a5a427c1f2a6cd9db666 +0 -0
  85. data/test/dummy/tmp/cache/assets/D9F/6A0/sprockets%2F415cba7de981a2df5af982b546bbf064 +0 -0
  86. data/test/dummy/tmp/cache/assets/DBC/7B0/sprockets%2Fbd0fd218d2e084da2a4a3026cf71a9ef +0 -0
  87. data/test/dummy/tmp/cache/assets/DC2/AF0/sprockets%2F3cd60b3d8a714ddcdc4256558f0aedc0 +0 -0
  88. data/test/dummy/tmp/cache/assets/{D84/210/sprockets%2Fabd0103ccec2b428ac62c94e4c40b384 → DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994} +0 -0
  89. data/test/dummy/tmp/cache/assets/DDD/DA0/sprockets%2Ffef9a2b73f2ed6a6042b5f4cd88279df +0 -0
  90. data/test/dummy/tmp/cache/assets/DDF/F90/sprockets%2Ffdb9a7e2104ed9ab57d12896fdb5f9d7 +0 -0
  91. data/test/dummy/tmp/cache/assets/{CF7/670/sprockets%2F00b214e322c484fcc1555dafaa240947 → DE1/6A0/sprockets%2Fcae9aba95894da8a28fa8a5387dc565f} +0 -0
  92. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  93. data/test/dummy/tmp/cache/assets/E1B/AD0/sprockets%2F150cafe2db298a20f82fbadac1d7a7e2 +0 -0
  94. data/test/dummy/tmp/cache/assets/{D6B/5D0/sprockets%2F48da0deeef45ff0cac611596e0774114 → E1D/010/sprockets%2Fdffad412d86bfdfbb1f307d711da21d3} +0 -0
  95. data/test/dummy/tmp/cache/assets/E3D/7F0/sprockets%2Faa9db9e2e4799a861f0fff2d7ab09cee +0 -0
  96. data/test/dummy/tmp/cache/assets/E55/150/sprockets%2F7ade5edd1b6d232bd5eab48b3bdc64c8 +0 -0
  97. data/test/dummy/tmp/cache/sass/570e82feeccb881a24a9919fb3feaf73dcbe19fa/_bootstrap.scssc +0 -0
  98. data/test/dummy/tmp/cache/sass/900d735417fe8d5104d4de0e0165ff7cb5492466/main.css.scssc +0 -0
  99. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_accordion.scssc +0 -0
  100. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_alerts.scssc +0 -0
  101. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_breadcrumbs.scssc +0 -0
  102. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_button-groups.scssc +0 -0
  103. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_buttons.scssc +0 -0
  104. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_carousel.scssc +0 -0
  105. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_close.scssc +0 -0
  106. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_code.scssc +0 -0
  107. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_component-animations.scssc +0 -0
  108. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_dropdowns.scssc +0 -0
  109. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_forms.scssc +0 -0
  110. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_grid.scssc +0 -0
  111. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_hero-unit.scssc +0 -0
  112. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_labels-badges.scssc +0 -0
  113. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_layouts.scssc +0 -0
  114. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_mixins.scssc +0 -0
  115. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_modals.scssc +0 -0
  116. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_navbar.scssc +0 -0
  117. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_navs.scssc +0 -0
  118. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_pager.scssc +0 -0
  119. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_pagination.scssc +0 -0
  120. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_popovers.scssc +0 -0
  121. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_progress-bars.scssc +0 -0
  122. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_reset.scssc +0 -0
  123. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_scaffolding.scssc +0 -0
  124. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_sprites.scssc +0 -0
  125. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_tables.scssc +0 -0
  126. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_thumbnails.scssc +0 -0
  127. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_tooltip.scssc +0 -0
  128. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_type.scssc +0 -0
  129. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_utilities.scssc +0 -0
  130. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_variables.scssc +0 -0
  131. data/test/dummy/tmp/cache/sass/ac81519228da4075394a77780983d95f3f77aa1d/_wells.scssc +0 -0
  132. data/test/dummy/tmp/pids/server.pid +1 -0
  133. metadata +251 -65
  134. data/test/dummy/app/assets/javascripts/main.js +0 -0
  135. data/test/dummy/app/assets/stylesheets/contacts.css +0 -0
  136. data/test/dummy/app/assets/stylesheets/main.css +0 -0
  137. data/test/dummy/app/views/contacts/_form.html.erb +0 -21
  138. data/test/dummy/app/views/contacts/edit.html.erb +0 -4
  139. data/test/dummy/app/views/contacts/index.html.erb +0 -19
  140. data/test/dummy/app/views/contacts/new.html.erb +0 -4
  141. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  142. data/test/dummy/app/views/main/index.html.erb +0 -9
  143. data/test/dummy/tmp/cache/assets/BAB/A00/sprockets%2F347f335128024408181207cbc0461526 +0 -0
  144. data/test/dummy/tmp/cache/assets/C77/F30/sprockets%2F021780432569bfa6c8135d5d4111f2e8 +0 -0
  145. data/test/dummy/tmp/cache/assets/C89/150/sprockets%2F1ff78c0e818b9e0311560396b734719e +0 -0
  146. data/test/dummy/tmp/cache/assets/CE1/BA0/sprockets%2F263ecf6bc5196b70405d900e7c44c946 +0 -0
  147. data/test/dummy/tmp/cache/assets/D06/B40/sprockets%2F25fca4643219052b0d5c66cf2c71f72f +0 -0
  148. data/test/dummy/tmp/cache/assets/D11/430/sprockets%2F25ea8d6063b1eb98361b1196f2fce807 +0 -0
  149. data/test/dummy/tmp/cache/assets/D24/5A0/sprockets%2F3a89b583dd80975d1e0968e730de5bc9 +0 -0
  150. data/test/dummy/tmp/cache/assets/D2D/490/sprockets%2F52514897c01dab621a0d9892aafb1ea2 +0 -0
  151. data/test/dummy/tmp/cache/assets/D54/ED0/sprockets%2F71c9fa01091d432b131da3bb73faf3d4 +0 -177
  152. data/test/dummy/tmp/cache/assets/D84/170/sprockets%2Fd09fc89236193cb0ff9deb09b97c648d +0 -0
  153. data/test/dummy/tmp/cache/assets/DA5/7E0/sprockets%2F87a5f378354ce6e80dda84ab1cfd06f3 +0 -0
  154. data/test/dummy/tmp/cache/assets/DA7/530/sprockets%2Fe36b8fcf5914a3a6bf058abfe7367b19 +0 -0
  155. data/test/dummy/tmp/cache/assets/DAA/470/sprockets%2Faa2b19ddf75cee55d7f2822e3da55779 +0 -0
@@ -7,4 +7,4 @@ module Formula
7
7
  ActionView::Base.send :include, Formula::FormulaFormHelper
8
8
  end
9
9
  end
10
- end
10
+ end
@@ -1,3 +1,3 @@
1
1
  module Formula
2
- VERSION = "0.3.5"
2
+ VERSION = "0.3.6"
3
3
  end
@@ -0,0 +1,6 @@
1
+ = formula_form_for(@<%= singular_table_name %>) do |form|
2
+ <%- attributes.each do |attribute -%>
3
+ = form.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %>
4
+ <%- end -%>
5
+
6
+ = form.button :submit
@@ -1,3 +1,4 @@
1
1
  //= require jquery
2
2
  //= require jquery_ujs
3
- //= require_tree .
3
+ //= require bootstrap
4
+ //= require_tree .
@@ -1,173 +1,9 @@
1
1
  /*
2
2
  *= require_self
3
- *= require_tree .
3
+ *= require_tree .
4
4
  */
5
5
 
6
- /* global */
7
-
8
- html, body
9
- {
10
- font-family: Helvetica, Verdana, Arial, sans-serif;
11
- font-style: normal;
12
- font-weight: normal;
13
- }
14
-
15
- /* grid */
16
-
17
- .container
18
- {
19
- width: 960px;
20
- margin-left: auto;
21
- margin-right: auto;
22
- }
23
-
24
- .grid-01, .grid-02, .grid-03, .grid-04, .grid-05, .grid-06, .grid-07, .grid-08, .grid-09, .grid-10, .grid-11, .grid-12
25
- {
26
- float: left;
27
- display: inline;
28
- position: relative;
29
- margin-left: 10px;
30
- margin-right: 10px;
31
- }
32
-
33
- .alpha { margin-left: 0px; }
34
- .omega { margin-right: 0px; }
35
-
36
- .grid-01 { width: 60px; }
37
- .grid-02 { width: 140px; }
38
- .grid-03 { width: 220px; }
39
- .grid-04 { width: 300px; }
40
- .grid-05 { width: 380px; }
41
- .grid-06 { width: 460px; }
42
- .grid-07 { width: 540px; }
43
- .grid-08 { width: 620px; }
44
- .grid-09 { width: 700px; }
45
- .grid-10 { width: 780px; }
46
- .grid-11 { width: 860px; }
47
- .grid-12 { width: 940px; }
48
-
49
- .prefix-01 { padding-left: 80px; }
50
- .suffix-01 { padding-right: 80px; }
51
- .prefix-02 { padding-left: 160px; }
52
- .suffix-02 { padding-right: 160px; }
53
- .prefix-03 { padding-left: 240px; }
54
- .suffix-03 { padding-right: 240px; }
55
- .prefix-04 { padding-left: 320px; }
56
- .suffix-04 { padding-right: 320px; }
57
- .prefix-05 { padding-left: 400px; }
58
- .suffix-05 { padding-right: 400px; }
59
- .prefix-06 { padding-left: 480px; }
60
- .suffix-06 { padding-right: 480px; }
61
- .prefix-07 { padding-left: 560px; }
62
- .suffix-07 { padding-right: 560px; }
63
- .prefix-08 { padding-left: 640px; }
64
- .suffix-08 { padding-right: 640px; }
65
- .prefix-09 { padding-left: 720px; }
66
- .suffix-09 { padding-right: 720px; }
67
- .prefix-10 { padding-left: 800px; }
68
- .suffix-10 { padding-right: 800px; }
69
- .prefix-11 { padding-left: 880px; }
70
- .suffix-11 { padding-right: 880px; }
71
-
72
- .left { float: left; }
73
- .right { float: right; }
74
-
75
- .center { text-align: center; }
76
- .justify { text-align: justify; }
77
-
78
- .clear
79
- {
80
- clear: both;
81
- overflow: hidden;
82
- visibility: hidden;
83
- height: 0px;
84
- width: 0px;
85
- }
86
-
87
- /* form */
88
-
89
- .field_with_errors
90
- {
91
- display: inline;
92
- }
93
-
94
- .input
95
- {
96
- padding: 0px;
97
- }
98
-
99
- .input.url, .input.text, .input.email, .input.string, .input.phone, .input.password
100
- {
101
- padding: 0px 20px 0px 0px;
102
- }
103
-
104
- .block
105
- {
106
- padding: 4px 0px;
107
- }
108
-
109
- .hint
110
- {
111
- display: block;
112
- color: #888;
113
- margin: 2px 0px;
114
- padding: 0px;
115
- font-size: 12px;
116
- font-weight: normal;
117
- }
118
-
119
- .error
120
- {
121
- display: block;
122
- color: #C22;
123
- margin: 2px 0px;
124
- padding: 0px;
125
- font-size: 12px;
126
- font-weight: bolder;
127
- }
128
-
129
- .errors label
130
- {
131
- color: #A00;
132
- }
133
-
134
- .errors .hint
135
- {
136
- color: #A00;
137
- }
138
-
139
- .errors .error
140
- {
141
- color: #A00;
142
- }
143
-
144
- label
145
- {
146
- display: inline;
147
- color: #444;
148
- margin: 2px 0px;
149
- padding: 0px;
150
- font-size: 14px;
151
- font-weight: normal;
152
- }
153
-
154
- input[type="url"],
155
- input[type="tel"],
156
- input[type="text"],
157
- input[type="email"],
158
- input[type="password"],
159
- textarea
160
- {
161
- width: 100%;
162
- padding: 8px;
163
- font-size: 16px;
164
- font-weight: normal;
165
- }
166
-
167
- textarea
6
+ body
168
7
  {
169
- width: 100%;
170
- padding: 8px;
171
- font-size: 16px;
172
- font-weight: normal;d
173
- }
8
+ padding: 80px 0px;
9
+ }
@@ -0,0 +1,6 @@
1
+ @import "bootstrap";
2
+
3
+ .modal form
4
+ {
5
+ margin: auto;
6
+ }
@@ -1,3 +1,59 @@
1
1
  class ApplicationController < ActionController::Base
2
+
2
3
  protect_from_forgery
4
+
5
+ helper_method :user
6
+ helper_method :authenticated?
7
+
8
+ private
9
+
10
+ def user
11
+ cookie = cookies.signed[:user]
12
+ @_user ||= User.find(cookie) rescue deauthenticate if cookie
13
+ end
14
+
15
+ def authenticate(user)
16
+ cookies.permanent.signed[:user] = user.id
17
+ end
18
+
19
+ def deauthenticate
20
+ cookies.delete :user
21
+ end
22
+
23
+ def authenticated?
24
+ user.present?
25
+ end
26
+
27
+ def authenticate!
28
+ unless authenticated?
29
+ store
30
+ flash[:warning] = 'You must be logged in.'
31
+ respond_to do |format|
32
+ format.html { redirect_to new_user_path }
33
+ end
34
+ return false
35
+ end
36
+ end
37
+
38
+ def deauthenticate!
39
+ if authenticated?
40
+ store
41
+ flash[:warning] = 'You must be logged out.'
42
+ respond_to do |format|
43
+ format.html { redirect_to edit_user_path }
44
+ end
45
+ return false
46
+ end
47
+ end
48
+
49
+ def store
50
+ session[:location] = request.fullpath
51
+ end
52
+
53
+ def restore(options)
54
+ location = session[:location] || options[:default]
55
+ session[:location] = nil
56
+ return location
57
+ end
58
+
3
59
  end
@@ -1,37 +1,44 @@
1
1
  class ContactsController < ApplicationController
2
-
2
+
3
3
  respond_to :html
4
-
4
+
5
5
  # GET /contacts
6
6
  def index
7
7
  @contacts = Contact.all
8
8
  respond_with(@contacts)
9
9
  end
10
-
10
+
11
11
  # GET /contacts/new
12
12
  def new
13
13
  @contact = Contact.new
14
14
  respond_with(@contact)
15
15
  end
16
-
16
+
17
17
  # GET /contacts/:id/edit
18
18
  def edit
19
19
  @contact = Contact.find(params[:id])
20
20
  respond_with(@contact)
21
21
  end
22
-
22
+
23
23
  # POST /contacts
24
24
  def create
25
25
  @contact = Contact.create(params[:contact])
26
26
  respond_with(@contact, :location => contacts_path)
27
27
  end
28
-
29
- # put /contacts
28
+
29
+ # PUT /contacts
30
30
  def update
31
31
  @contact = Contact.find(params[:id])
32
32
  @contact.attributes = params[:contact]
33
33
  @contact.save
34
34
  respond_with(@contact, :location => contacts_path)
35
35
  end
36
-
36
+
37
+ # DELETE /contacts/:id
38
+ def destroy
39
+ @contact = Contact.find(params[:id])
40
+ @contact.delete
41
+ respond_with(@contact, :location => contacts_path)
42
+ end
43
+
37
44
  end
@@ -1,10 +1,10 @@
1
1
  class MainController < ApplicationController
2
-
2
+
3
3
  # GET /
4
4
  def index
5
5
  respond_to do |format|
6
6
  format.html
7
7
  end
8
8
  end
9
-
9
+
10
10
  end
@@ -0,0 +1,37 @@
1
+ class SessionsController < ApplicationController
2
+
3
+ respond_to :html, :js
4
+
5
+ before_filter :authenticate!, :only => [:destroy]
6
+ before_filter :deauthenticate!, :only => [:new, :create]
7
+
8
+ # GET /session/new
9
+ def new
10
+ @session = Session.new
11
+
12
+ respond_with(@session)
13
+ end
14
+
15
+ # POST /session
16
+ def create
17
+ @session = Session.new(params[:session])
18
+
19
+ flash[:notice] = 'Session create successful.' if @session.valid?
20
+ flash[:error] = 'Session create failed.' if @session.invalid?
21
+
22
+ authenticate(@session.user) if @session.valid?
23
+ respond_with(@session, :location => restore(:default => root_path))
24
+ end
25
+
26
+ # DELETE /session
27
+ def destroy
28
+ flash[:notice] = 'Session destroyed.'
29
+
30
+ deauthenticate()
31
+
32
+ respond_to do |format|
33
+ format.html { redirect_to(restore(:default => root_path)) }
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,46 @@
1
+ class UsersController < ApplicationController
2
+
3
+ respond_to :html, :js
4
+
5
+ before_filter :authenticate!, :only => [:edit, :update]
6
+ before_filter :deauthenticate!, :only => [:new, :create]
7
+
8
+ # GET /user/new
9
+ def new
10
+ @user = User.new
11
+
12
+ respond_with(@user)
13
+ end
14
+
15
+ # GET /user/edit
16
+ def edit
17
+ @user = user
18
+
19
+ respond_with(@user)
20
+ end
21
+
22
+ # POST /user
23
+ def create
24
+ @user = User.create(params[:user])
25
+
26
+ flash[:notice] = 'User create successful.' if @user.valid?
27
+ flash[:error] = 'User create failed.' if @user.invalid?
28
+
29
+ authenticate(@user) if @user.valid?
30
+ respond_with(@user, :location => restore(:default => root_path))
31
+ end
32
+
33
+ # PUT /user
34
+ def update
35
+ @user = user
36
+
37
+ @user.attributes = params[:user]
38
+ @user.save
39
+
40
+ flash[:notice] = 'User update successful.' if @user.valid?
41
+ flash[:error] = 'User update failed.' if @user.invalid?
42
+
43
+ respond_with(@user, :location => restore(:default => root_path))
44
+ end
45
+
46
+ end
@@ -0,0 +1,2 @@
1
+ module SessionsHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module UsersHelper
2
+ end
@@ -1,19 +1,19 @@
1
1
  class Contact < ActiveRecord::Base
2
-
2
+
3
3
  attr_accessor :secret
4
-
4
+
5
5
  belongs_to :group
6
-
6
+
7
7
  validates_presence_of :name
8
8
  validates_presence_of :details
9
9
  validates_presence_of :email
10
10
  validates_presence_of :phone
11
11
  validates_presence_of :url
12
12
  validates_presence_of :group
13
-
13
+
14
14
  validates_format_of :email, :with => /\A([^\s]+)@([^\s]+)\Z/i, :message => "is not valid"
15
15
  validates_format_of :phone, :with => /\A[0-9\s\(\)\+\-]+\Z/i, :message => "is not valid"
16
-
16
+
17
17
  has_attached :avatar
18
-
18
+
19
19
  end