admin_assistant 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (377) hide show
  1. data/.gitignore +16 -0
  2. data/Rakefile +34 -6
  3. data/VERSION +1 -0
  4. data/admin_assistant.gemspec +440 -0
  5. data/doc/img/blog_posts-index.png +0 -0
  6. data/install.rb +25 -4
  7. data/lib/admin_assistant/active_record_column.rb +133 -45
  8. data/lib/admin_assistant/association_target.rb +16 -3
  9. data/lib/admin_assistant/belongs_to_column.rb +18 -10
  10. data/lib/admin_assistant/builder.rb +67 -30
  11. data/lib/admin_assistant/column.rb +153 -71
  12. data/lib/admin_assistant/date_time_range_end_point_selector.rb +340 -0
  13. data/lib/admin_assistant/default_search_column.rb +3 -7
  14. data/lib/admin_assistant/form_view.rb +114 -10
  15. data/lib/admin_assistant/has_many_column.rb +56 -0
  16. data/lib/admin_assistant/index.rb +220 -83
  17. data/lib/admin_assistant/polymorphic_belongs_to_column.rb +1 -1
  18. data/lib/admin_assistant/request/base.rb +196 -67
  19. data/lib/admin_assistant/request/create.rb +55 -7
  20. data/lib/admin_assistant/request/edit.rb +1 -2
  21. data/lib/admin_assistant/request/index.rb +16 -9
  22. data/lib/admin_assistant/request/new.rb +19 -7
  23. data/lib/admin_assistant/request/update.rb +28 -13
  24. data/lib/admin_assistant/search.rb +17 -2
  25. data/lib/admin_assistant/virtual_column.rb +15 -7
  26. data/lib/admin_assistant.rb +101 -81
  27. data/lib/javascripts/admin_assistant.js +1 -1
  28. data/lib/stylesheets/activescaffold.css +6 -1
  29. data/lib/stylesheets/default.css +17 -0
  30. data/lib/views/form.html.erb +7 -3
  31. data/lib/views/index.html.erb +13 -8
  32. data/lib/views/multi_form.html.erb +71 -0
  33. data/lib/views/show.html.erb +4 -4
  34. data/test_rails_app/README +256 -0
  35. data/test_rails_app/Rakefile +13 -0
  36. data/test_rails_app/app/controllers/admin/appointments2_controller.rb +15 -0
  37. data/test_rails_app/app/controllers/admin/appointments_controller.rb +11 -0
  38. data/test_rails_app/app/controllers/admin/blog_posts2_controller.rb +138 -0
  39. data/test_rails_app/app/controllers/admin/blog_posts3_controller.rb +76 -0
  40. data/test_rails_app/app/controllers/admin/blog_posts4_controller.rb +21 -0
  41. data/test_rails_app/app/controllers/admin/blog_posts5_controller.rb +27 -0
  42. data/test_rails_app/app/controllers/admin/blog_posts6_controller.rb +10 -0
  43. data/test_rails_app/app/controllers/admin/blog_posts_controller.rb +8 -0
  44. data/test_rails_app/app/controllers/admin/blog_posts_custom_new_and_edit_controller.rb +15 -0
  45. data/test_rails_app/app/controllers/admin/blog_posts_read_only_controller.rb +19 -0
  46. data/test_rails_app/app/controllers/admin/bookmarks_controller.rb +11 -0
  47. data/test_rails_app/app/controllers/admin/comments2_controller.rb +14 -0
  48. data/test_rails_app/app/controllers/admin/comments_controller.rb +12 -0
  49. data/test_rails_app/app/controllers/admin/file_column_images2_controller.rb +10 -0
  50. data/test_rails_app/app/controllers/admin/file_column_images_controller.rb +6 -0
  51. data/test_rails_app/app/controllers/admin/images2_controller.rb +11 -0
  52. data/test_rails_app/app/controllers/admin/images_controller.rb +6 -0
  53. data/test_rails_app/app/controllers/admin/misconfigured1_controller.rb +7 -0
  54. data/test_rails_app/app/controllers/admin/not_migrated_yets_controller.rb +9 -0
  55. data/test_rails_app/app/controllers/admin/product_categories2_controller.rb +7 -0
  56. data/test_rails_app/app/controllers/admin/product_categories_controller.rb +5 -0
  57. data/test_rails_app/app/controllers/admin/products2_controller.rb +15 -0
  58. data/test_rails_app/app/controllers/admin/products_controller.rb +31 -0
  59. data/test_rails_app/app/controllers/admin/television_airings_controller.rb +5 -0
  60. data/test_rails_app/app/controllers/admin/television_time_slots_controller.rb +5 -0
  61. data/test_rails_app/app/controllers/admin/users2_controller.rb +10 -0
  62. data/test_rails_app/app/controllers/admin/users_controller.rb +63 -0
  63. data/test_rails_app/app/controllers/application.rb +16 -0
  64. data/test_rails_app/app/controllers/application_controller.rb +16 -0
  65. data/test_rails_app/app/controllers/blog_posts_controller.rb +5 -0
  66. data/test_rails_app/app/helpers/admin/appointments2_helper.rb +2 -0
  67. data/test_rails_app/app/helpers/admin/appointments_helper.rb +2 -0
  68. data/test_rails_app/app/helpers/admin/blog_posts2_helper.rb +27 -0
  69. data/test_rails_app/app/helpers/admin/blog_posts3_helper.rb +2 -0
  70. data/test_rails_app/app/helpers/admin/blog_posts4_helper.rb +2 -0
  71. data/test_rails_app/app/helpers/admin/blog_posts6_helper.rb +16 -0
  72. data/test_rails_app/app/helpers/admin/blog_posts_custom_new_and_edit_helper.rb +29 -0
  73. data/test_rails_app/app/helpers/admin/blog_posts_helper.rb +2 -0
  74. data/test_rails_app/app/helpers/admin/blog_posts_read_only_helper.rb +2 -0
  75. data/test_rails_app/app/helpers/admin/bookmarks_helper.rb +2 -0
  76. data/test_rails_app/app/helpers/admin/comments2_helper.rb +2 -0
  77. data/test_rails_app/app/helpers/admin/comments_helper.rb +2 -0
  78. data/test_rails_app/app/helpers/admin/file_column_images2_helper.rb +2 -0
  79. data/test_rails_app/app/helpers/admin/file_column_images_helper.rb +2 -0
  80. data/test_rails_app/app/helpers/admin/images2_helper.rb +8 -0
  81. data/test_rails_app/app/helpers/admin/images_helper.rb +2 -0
  82. data/test_rails_app/app/helpers/admin/misconfigured1_helper.rb +2 -0
  83. data/test_rails_app/app/helpers/admin/not_migrated_yets_helper.rb +2 -0
  84. data/test_rails_app/app/helpers/admin/product_categories2_helper.rb +2 -0
  85. data/test_rails_app/app/helpers/admin/product_categories_helper.rb +2 -0
  86. data/test_rails_app/app/helpers/admin/products2_helper.rb +3 -0
  87. data/test_rails_app/app/helpers/admin/products_helper.rb +6 -0
  88. data/test_rails_app/app/helpers/admin/television_airings_helper.rb +2 -0
  89. data/test_rails_app/app/helpers/admin/television_time_slots_helper.rb +2 -0
  90. data/test_rails_app/app/helpers/admin/users2_helper.rb +2 -0
  91. data/test_rails_app/app/helpers/admin/users_helper.rb +25 -0
  92. data/test_rails_app/app/helpers/application_helper.rb +3 -0
  93. data/test_rails_app/app/helpers/blog_posts_helper.rb +2 -0
  94. data/test_rails_app/app/models/appointment.rb +5 -0
  95. data/test_rails_app/app/models/blog_post.rb +14 -0
  96. data/test_rails_app/app/models/blog_post_tag.rb +6 -0
  97. data/test_rails_app/app/models/bookmark.rb +6 -0
  98. data/test_rails_app/app/models/comment.rb +4 -0
  99. data/test_rails_app/app/models/file_column_image.rb +3 -0
  100. data/test_rails_app/app/models/image.rb +3 -0
  101. data/test_rails_app/app/models/not_migrated_yet.rb +2 -0
  102. data/test_rails_app/app/models/product.rb +7 -0
  103. data/test_rails_app/app/models/product_category.rb +9 -0
  104. data/test_rails_app/app/models/tag.rb +4 -0
  105. data/test_rails_app/app/models/television_airing.rb +3 -0
  106. data/test_rails_app/app/models/television_time_slot.rb +11 -0
  107. data/test_rails_app/app/models/user.rb +14 -0
  108. data/test_rails_app/app/views/admin/appointments/_subject_input.html.erb +2 -0
  109. data/test_rails_app/app/views/admin/appointments2/_time_input.html.erb +31 -0
  110. data/test_rails_app/app/views/admin/blog_posts2/_after_form.html.erb +5 -0
  111. data/test_rails_app/app/views/admin/blog_posts2/_after_index.html.erb +1 -0
  112. data/test_rails_app/app/views/admin/blog_posts2/_after_tags_input.html.erb +16 -0
  113. data/test_rails_app/app/views/admin/blog_posts2/_before_index.html.erb +2 -0
  114. data/test_rails_app/app/views/admin/blog_posts5/_after_index_header.html.erb +8 -0
  115. data/test_rails_app/app/views/admin/blog_posts_read_only/_body_for_show.html.erb +1 -0
  116. data/test_rails_app/app/views/admin/products/_name_input.html.erb +2 -0
  117. data/test_rails_app/app/views/admin/products/_percent_off_input.html.erb +2 -0
  118. data/test_rails_app/app/views/admin/products/_price_input.html.erb +10 -0
  119. data/test_rails_app/app/views/blog_posts/show.html.erb +13 -0
  120. data/test_rails_app/app/views/layouts/admin.html.erb +31 -0
  121. data/test_rails_app/config/boot.rb +109 -0
  122. data/test_rails_app/config/database.yml +28 -0
  123. data/test_rails_app/config/environment.rb +78 -0
  124. data/test_rails_app/config/environments/development.rb +17 -0
  125. data/test_rails_app/config/environments/production.rb +24 -0
  126. data/test_rails_app/config/environments/test.rb +24 -0
  127. data/test_rails_app/config/initializers/inflections.rb +10 -0
  128. data/test_rails_app/config/initializers/mime_types.rb +5 -0
  129. data/test_rails_app/config/initializers/new_rails_defaults.rb +17 -0
  130. data/test_rails_app/config/locales/en.yml +5 -0
  131. data/test_rails_app/config/routes.rb +43 -0
  132. data/test_rails_app/db/migrate/20090213215514_create_blog_posts.rb +12 -0
  133. data/test_rails_app/db/migrate/20090217225542_add_body_to_blog_posts.rb +9 -0
  134. data/test_rails_app/db/migrate/20090221220917_create_tags.rb +13 -0
  135. data/test_rails_app/db/migrate/20090221220947_create_blog_post_tags.rb +14 -0
  136. data/test_rails_app/db/migrate/20090222162204_add_textile_to_blog_posts.rb +9 -0
  137. data/test_rails_app/db/migrate/20090222163231_add_published_at_to_blog_posts.rb +9 -0
  138. data/test_rails_app/db/migrate/20090301191722_create_images.rb +16 -0
  139. data/test_rails_app/db/migrate/20090305165345_create_accounts.rb +14 -0
  140. data/test_rails_app/db/migrate/20090307225027_rename_accounts_to_users.rb +9 -0
  141. data/test_rails_app/db/migrate/20090307225750_add_user_id_to_blog_posts.rb +9 -0
  142. data/test_rails_app/db/migrate/20090309185114_change_blog_posts_textile.rb +9 -0
  143. data/test_rails_app/db/migrate/20090309193635_create_products.rb +14 -0
  144. data/test_rails_app/db/migrate/20090309203056_create_comments.rb +15 -0
  145. data/test_rails_app/db/migrate/20090323005947_create_file_column_images.rb +12 -0
  146. data/test_rails_app/db/migrate/20090326160049_add_birthday_to_users.rb +9 -0
  147. data/test_rails_app/db/migrate/20090326223606_add_state_to_users.rb +9 -0
  148. data/test_rails_app/db/migrate/20090503134004_add_file_column_image_to_products.rb +9 -0
  149. data/test_rails_app/db/migrate/20090617173651_create_bookmarks.rb +15 -0
  150. data/test_rails_app/db/migrate/20090624165355_add_tags_string_to_blog_post.rb +9 -0
  151. data/test_rails_app/db/migrate/20090625144313_add_avatar_fields_to_user.rb +11 -0
  152. data/test_rails_app/db/migrate/20090629202956_add_merged_into_to_blog_posts.rb +9 -0
  153. data/test_rails_app/db/migrate/20090701171857_add_force_textile_to_users.rb +9 -0
  154. data/test_rails_app/db/migrate/20090704163647_add_deleted_at_to_products.rb +9 -0
  155. data/test_rails_app/db/migrate/20090704173800_add_sale_fields_to_products.rb +13 -0
  156. data/test_rails_app/db/migrate/20090714024501_create_product_categories.rb +15 -0
  157. data/test_rails_app/db/migrate/20090819162835_add_admin_level_to_users.rb +9 -0
  158. data/test_rails_app/db/migrate/20091115134559_add_first_and_last_names_to_users.rb +11 -0
  159. data/test_rails_app/db/migrate/20091221011256_add_position_to_product_categories.rb +9 -0
  160. data/test_rails_app/db/migrate/20091222160814_create_appointments.rb +14 -0
  161. data/test_rails_app/db/migrate/20091227224547_add_user_id_to_appointments.rb +9 -0
  162. data/test_rails_app/db/migrate/20100214213359_create_television_time_slots.rb +13 -0
  163. data/test_rails_app/db/migrate/20100214213451_create_television_airings.rb +15 -0
  164. data/test_rails_app/doc/README_FOR_APP +5 -0
  165. data/test_rails_app/lib/tasks/rspec.rake +163 -0
  166. data/test_rails_app/public/404.html +30 -0
  167. data/test_rails_app/public/422.html +30 -0
  168. data/test_rails_app/public/500.html +33 -0
  169. data/test_rails_app/public/dispatch.cgi +10 -0
  170. data/test_rails_app/public/dispatch.fcgi +24 -0
  171. data/test_rails_app/public/dispatch.rb +10 -0
  172. data/test_rails_app/public/favicon.ico +0 -0
  173. data/test_rails_app/public/images/rails.png +0 -0
  174. data/test_rails_app/public/index.html +274 -0
  175. data/test_rails_app/public/javascripts/application.js +2 -0
  176. data/test_rails_app/public/javascripts/controls.js +963 -0
  177. data/test_rails_app/public/javascripts/dragdrop.js +973 -0
  178. data/test_rails_app/public/javascripts/effects.js +1128 -0
  179. data/test_rails_app/public/javascripts/prototype.js +4320 -0
  180. data/test_rails_app/public/robots.txt +5 -0
  181. data/test_rails_app/public/stylesheets/admin.css +3 -0
  182. data/test_rails_app/public/stylesheets/scaffold.css +54 -0
  183. data/test_rails_app/script/about +4 -0
  184. data/test_rails_app/script/autospec +5 -0
  185. data/test_rails_app/script/console +3 -0
  186. data/test_rails_app/script/dbconsole +3 -0
  187. data/test_rails_app/script/destroy +3 -0
  188. data/test_rails_app/script/generate +3 -0
  189. data/test_rails_app/script/performance/benchmarker +3 -0
  190. data/test_rails_app/script/performance/profiler +3 -0
  191. data/test_rails_app/script/performance/request +3 -0
  192. data/test_rails_app/script/plugin +3 -0
  193. data/test_rails_app/script/populate_tables.rb +49 -0
  194. data/test_rails_app/script/process/inspector +3 -0
  195. data/test_rails_app/script/process/reaper +3 -0
  196. data/test_rails_app/script/process/spawner +3 -0
  197. data/test_rails_app/script/runner +3 -0
  198. data/test_rails_app/script/server +3 -0
  199. data/test_rails_app/script/spec +5 -0
  200. data/test_rails_app/script/spec_server +125 -0
  201. data/test_rails_app/spec/controllers/admin/appointments2_controller_spec.rb +88 -0
  202. data/test_rails_app/spec/controllers/admin/appointments_controller_spec.rb +419 -0
  203. data/test_rails_app/spec/controllers/admin/blog_posts2_controller_spec.rb +1021 -0
  204. data/test_rails_app/spec/controllers/admin/blog_posts3_controller_spec.rb +532 -0
  205. data/test_rails_app/spec/controllers/admin/blog_posts4_controller_spec.rb +231 -0
  206. data/test_rails_app/spec/controllers/admin/blog_posts5_controller_spec.rb +77 -0
  207. data/test_rails_app/spec/controllers/admin/blog_posts6_controller_spec.rb +49 -0
  208. data/test_rails_app/spec/controllers/admin/blog_posts_controller_spec.rb +987 -0
  209. data/test_rails_app/spec/controllers/admin/blog_posts_custom_new_and_edit_controller_spec.rb +99 -0
  210. data/test_rails_app/spec/controllers/admin/blog_posts_read_only_controller_spec.rb +94 -0
  211. data/test_rails_app/spec/controllers/admin/bookmarks_controller_spec.rb +505 -0
  212. data/test_rails_app/spec/controllers/admin/comments2_controller_spec.rb +70 -0
  213. data/test_rails_app/spec/controllers/admin/comments_controller_spec.rb +82 -0
  214. data/test_rails_app/spec/controllers/admin/file_column_images2_controller_spec.rb +25 -0
  215. data/test_rails_app/spec/controllers/admin/file_column_images_controller_spec.rb +82 -0
  216. data/test_rails_app/spec/controllers/admin/images2_controller_spec.rb +44 -0
  217. data/test_rails_app/spec/controllers/admin/images_controller_spec.rb +97 -0
  218. data/test_rails_app/spec/controllers/admin/misconfigured1_controller_spec.rb +21 -0
  219. data/test_rails_app/spec/controllers/admin/not_migrated_yets_controller_spec.rb +10 -0
  220. data/test_rails_app/spec/controllers/admin/product_categories2_controller_spec.rb +215 -0
  221. data/test_rails_app/spec/controllers/admin/product_categories_controller_spec.rb +19 -0
  222. data/test_rails_app/spec/controllers/admin/products2_controller_spec.rb +203 -0
  223. data/test_rails_app/spec/controllers/admin/products_controller_spec.rb +255 -0
  224. data/test_rails_app/spec/controllers/admin/television_airings_controller_spec.rb +32 -0
  225. data/test_rails_app/spec/controllers/admin/television_time_slots_controller_spec.rb +10 -0
  226. data/test_rails_app/spec/controllers/admin/users2_controller_spec.rb +65 -0
  227. data/test_rails_app/spec/controllers/admin/users_controller_spec.rb +344 -0
  228. data/test_rails_app/spec/controllers/blog_posts_controller_spec.rb +13 -0
  229. data/test_rails_app/spec/data/ruby_throated.jpg +0 -0
  230. data/test_rails_app/spec/data/tweenbot.jpg +0 -0
  231. data/test_rails_app/spec/fixtures/appointments.yml +9 -0
  232. data/test_rails_app/spec/fixtures/blog_post_tags.yml +9 -0
  233. data/test_rails_app/spec/fixtures/blog_posts.yml +7 -0
  234. data/test_rails_app/spec/fixtures/bookmarks.yml +11 -0
  235. data/test_rails_app/spec/fixtures/comments.yml +11 -0
  236. data/test_rails_app/spec/fixtures/file_column_images.yml +7 -0
  237. data/test_rails_app/spec/fixtures/images.yml +7 -0
  238. data/test_rails_app/spec/fixtures/not_migrated_yets.yml +7 -0
  239. data/test_rails_app/spec/fixtures/product_categories.yml +7 -0
  240. data/test_rails_app/spec/fixtures/products.yml +9 -0
  241. data/test_rails_app/spec/fixtures/tags.yml +7 -0
  242. data/test_rails_app/spec/fixtures/television_airings.yml +11 -0
  243. data/test_rails_app/spec/fixtures/television_time_slots.yml +7 -0
  244. data/test_rails_app/spec/fixtures/users.yml +9 -0
  245. data/test_rails_app/spec/helpers/admin/appointments2_helper_spec.rb +11 -0
  246. data/test_rails_app/spec/helpers/admin/appointments_helper_spec.rb +11 -0
  247. data/test_rails_app/spec/helpers/admin/blog_posts2_helper_spec.rb +11 -0
  248. data/test_rails_app/spec/helpers/admin/blog_posts3_helper_spec.rb +11 -0
  249. data/test_rails_app/spec/helpers/admin/blog_posts4_helper_spec.rb +11 -0
  250. data/test_rails_app/spec/helpers/admin/blog_posts_custom_new_and_edit_helper_spec.rb +11 -0
  251. data/test_rails_app/spec/helpers/admin/blog_posts_helper_spec.rb +11 -0
  252. data/test_rails_app/spec/helpers/admin/blog_posts_read_only_helper_spec.rb +11 -0
  253. data/test_rails_app/spec/helpers/admin/bookmarks_helper_spec.rb +11 -0
  254. data/test_rails_app/spec/helpers/admin/comments2_helper_spec.rb +11 -0
  255. data/test_rails_app/spec/helpers/admin/comments_helper_spec.rb +11 -0
  256. data/test_rails_app/spec/helpers/admin/file_column_images2_helper_spec.rb +11 -0
  257. data/test_rails_app/spec/helpers/admin/file_column_images_helper_spec.rb +11 -0
  258. data/test_rails_app/spec/helpers/admin/images2_helper_spec.rb +11 -0
  259. data/test_rails_app/spec/helpers/admin/images_helper_spec.rb +11 -0
  260. data/test_rails_app/spec/helpers/admin/misconfigured1_helper_spec.rb +11 -0
  261. data/test_rails_app/spec/helpers/admin/not_migrated_yets_helper_spec.rb +11 -0
  262. data/test_rails_app/spec/helpers/admin/product_categories2_helper_spec.rb +11 -0
  263. data/test_rails_app/spec/helpers/admin/product_categories_helper_spec.rb +11 -0
  264. data/test_rails_app/spec/helpers/admin/products2_helper_spec.rb +11 -0
  265. data/test_rails_app/spec/helpers/admin/products_helper_spec.rb +11 -0
  266. data/test_rails_app/spec/helpers/admin/television_airings_helper_spec.rb +11 -0
  267. data/test_rails_app/spec/helpers/admin/television_time_slots_helper_spec.rb +11 -0
  268. data/test_rails_app/spec/helpers/admin/users2_helper_spec.rb +11 -0
  269. data/test_rails_app/spec/helpers/admin/users_helper_spec.rb +11 -0
  270. data/test_rails_app/spec/helpers/blog_posts_helper_spec.rb +11 -0
  271. data/test_rails_app/spec/models/appointment_spec.rb +16 -0
  272. data/test_rails_app/spec/models/blog_post_spec.rb +13 -0
  273. data/test_rails_app/spec/models/blog_post_tag_spec.rb +14 -0
  274. data/test_rails_app/spec/models/bookmark_spec.rb +15 -0
  275. data/test_rails_app/spec/models/comment_spec.rb +15 -0
  276. data/test_rails_app/spec/models/file_column_image_spec.rb +12 -0
  277. data/test_rails_app/spec/models/image_spec.rb +12 -0
  278. data/test_rails_app/spec/models/not_migrated_yet_spec.rb +15 -0
  279. data/test_rails_app/spec/models/product_category_spec.rb +15 -0
  280. data/test_rails_app/spec/models/product_spec.rb +14 -0
  281. data/test_rails_app/spec/models/tag_spec.rb +13 -0
  282. data/test_rails_app/spec/models/television_airing_spec.rb +15 -0
  283. data/test_rails_app/spec/models/television_time_slot_spec.rb +13 -0
  284. data/test_rails_app/spec/models/user_spec.rb +14 -0
  285. data/test_rails_app/spec/rcov.opts +2 -0
  286. data/test_rails_app/spec/spec.opts +4 -0
  287. data/test_rails_app/spec/spec_helper.rb +88 -0
  288. data/test_rails_app/spec/spec_or_test_helper.rb +49 -0
  289. data/test_rails_app/test/fixtures/file_column_images.yml +7 -0
  290. data/test_rails_app/test/integration/admin_blog_posts2_integration_test.rb +16 -0
  291. data/test_rails_app/test/integration/admin_blog_posts5_integration_test.rb +19 -0
  292. data/test_rails_app/test/integration/admin_blog_posts_integration_test.rb +25 -0
  293. data/test_rails_app/test/test_helper.rb +28 -0
  294. data/test_rails_app/vendor/plugins/file_column/CHANGELOG +69 -0
  295. data/test_rails_app/vendor/plugins/file_column/README +54 -0
  296. data/test_rails_app/vendor/plugins/file_column/Rakefile +36 -0
  297. data/test_rails_app/vendor/plugins/file_column/TODO +6 -0
  298. data/test_rails_app/vendor/plugins/file_column/init.rb +13 -0
  299. data/test_rails_app/vendor/plugins/file_column/lib/file_column.rb +723 -0
  300. data/test_rails_app/vendor/plugins/file_column/lib/file_column_helper.rb +150 -0
  301. data/test_rails_app/vendor/plugins/file_column/lib/file_compat.rb +28 -0
  302. data/test_rails_app/vendor/plugins/file_column/lib/magick_file_column.rb +260 -0
  303. data/test_rails_app/vendor/plugins/file_column/lib/rails_file_column.rb +19 -0
  304. data/test_rails_app/vendor/plugins/file_column/lib/test_case.rb +124 -0
  305. data/test_rails_app/vendor/plugins/file_column/lib/validations.rb +112 -0
  306. data/test_rails_app/vendor/plugins/file_column/test/abstract_unit.rb +63 -0
  307. data/test_rails_app/vendor/plugins/file_column/test/connection.rb +17 -0
  308. data/test_rails_app/vendor/plugins/file_column/test/file_column_helper_test.rb +97 -0
  309. data/test_rails_app/vendor/plugins/file_column/test/file_column_test.rb +650 -0
  310. data/test_rails_app/vendor/plugins/file_column/test/fixtures/entry.rb +32 -0
  311. data/test_rails_app/vendor/plugins/file_column/test/fixtures/invalid-image.jpg +1 -0
  312. data/test_rails_app/vendor/plugins/file_column/test/fixtures/kerb.jpg +0 -0
  313. data/test_rails_app/vendor/plugins/file_column/test/fixtures/mysql.sql +25 -0
  314. data/test_rails_app/vendor/plugins/file_column/test/fixtures/schema.rb +10 -0
  315. data/test_rails_app/vendor/plugins/file_column/test/fixtures/skanthak.png +0 -0
  316. data/test_rails_app/vendor/plugins/file_column/test/magick_test.rb +380 -0
  317. data/test_rails_app/vendor/plugins/file_column/test/magick_view_only_test.rb +21 -0
  318. data/vendor/ar_query/ar_query.gemspec +16 -0
  319. data/website/_layouts/api.html +39 -0
  320. data/website/_layouts/default.html +34 -0
  321. data/website/api/core.markdown +106 -0
  322. data/website/api/destroy.markdown +25 -0
  323. data/website/api/form.markdown +291 -0
  324. data/website/api/idx.markdown +286 -0
  325. data/website/api/index.markdown +147 -0
  326. data/website/api/search.markdown +108 -0
  327. data/website/api/show.markdown +22 -0
  328. data/website/community.markdown +27 -0
  329. data/website/css/lightbox.css +29 -0
  330. data/website/css/main.css +70 -0
  331. data/website/design_principles.markdown +50 -0
  332. data/website/getting_started.markdown +10 -0
  333. data/website/img/blog_posts-index.png +0 -0
  334. data/website/img/blog_posts-search.png +0 -0
  335. data/website/img/lightbox/bullet.gif +0 -0
  336. data/website/img/lightbox/close.gif +0 -0
  337. data/website/img/lightbox/closelabel.gif +0 -0
  338. data/website/img/lightbox/donate-button.gif +0 -0
  339. data/website/img/lightbox/download-icon.gif +0 -0
  340. data/website/img/lightbox/image-1.jpg +0 -0
  341. data/website/img/lightbox/loading.gif +0 -0
  342. data/website/img/lightbox/nextlabel.gif +0 -0
  343. data/website/img/lightbox/prevlabel.gif +0 -0
  344. data/website/img/lightbox/thumb-1.jpg +0 -0
  345. data/website/img/screen1-thumb.png +0 -0
  346. data/website/img/screen1.png +0 -0
  347. data/website/img/screen10-thumb.png +0 -0
  348. data/website/img/screen10.png +0 -0
  349. data/website/img/screen11-thumb.png +0 -0
  350. data/website/img/screen11.png +0 -0
  351. data/website/img/screen2-thumb.png +0 -0
  352. data/website/img/screen2.png +0 -0
  353. data/website/img/screen3-thumb.png +0 -0
  354. data/website/img/screen3.png +0 -0
  355. data/website/img/screen4-thumb.png +0 -0
  356. data/website/img/screen4.png +0 -0
  357. data/website/img/screen5-thumb.png +0 -0
  358. data/website/img/screen5.png +0 -0
  359. data/website/img/screen6-thumb.png +0 -0
  360. data/website/img/screen6.png +0 -0
  361. data/website/img/screen7-thumb.png +0 -0
  362. data/website/img/screen7.png +0 -0
  363. data/website/img/screen8-thumb.png +0 -0
  364. data/website/img/screen8.png +0 -0
  365. data/website/img/screen9-thumb.png +0 -0
  366. data/website/img/screen9.png +0 -0
  367. data/website/img/user-form.png +0 -0
  368. data/website/index.markdown +35 -0
  369. data/website/js/builder.js +136 -0
  370. data/website/js/effects.js +1122 -0
  371. data/website/js/lightbox.js +497 -0
  372. data/website/js/prototype.js +4221 -0
  373. data/website/js/scriptaculous.js +58 -0
  374. data/website/quick_start.markdown +44 -0
  375. data/website/screenshots.markdown +27 -0
  376. data/website/tutorial.markdown +56 -0
  377. metadata +391 -23
@@ -0,0 +1,291 @@
1
+ ---
2
+ layout: api
3
+ title: Form
4
+ ---
5
+
6
+ ![form](../img/user-form.png)
7
+
8
+ Form configuration affects both creating new records and updating existing records. Most of its customization happens through the form builder object:
9
+
10
+
11
+ class Admin::BlogPostsController < ApplicationController
12
+ admin_assistant_for BlogPost do |a|
13
+ a.form do |form|
14
+ form.columns :user, :title, :body
15
+ end
16
+ end
17
+ end
18
+
19
+ ### Form config options
20
+
21
+ #### columns
22
+
23
+ form.columns :user, :title, :body
24
+
25
+ Shows only these columns in the form.
26
+
27
+ #### columns\_for\_edit
28
+
29
+ form.columns_for_edit :title, :user, :published_at, :body, :merged_into
30
+
31
+ Shows only these columns in the edit action.
32
+
33
+
34
+ #### columns\_for\_new
35
+
36
+ form.columns_for_new :title, :user, :published_at
37
+
38
+ Shows only these columns in the new action.
39
+
40
+
41
+ #### multi
42
+
43
+ form.multi = true
44
+
45
+ Set this to true to enable multi-record creation in your form. Validation errors will be shown on top of the individual row that caused the error, and if any of the records has a validation error, none of the records will be created.
46
+
47
+ Please note that this feature is alpha and may change significantly in the near future. As always, input is appreciated.
48
+
49
+
50
+ #### submit\_buttons
51
+
52
+ form.submit_buttons << 'Preview'
53
+
54
+
55
+ By default, there is one button at the bottom of the form, saying either "Create" or "Update". By appending to this array you can specify other buttons, and then check if those buttons were clicked in `destination_after_save`, below.
56
+
57
+ ### Column config options
58
+
59
+ #### datetime\_select\_options
60
+
61
+ form[:published_at].datetime_select_options =
62
+ {:include_blank => false, :start_year => 2009}
63
+
64
+ Passes through these options to the datetime select for this column. By default this is set to `{:include_blank => true}`.
65
+
66
+ #### default
67
+
68
+ form[:published_at].default do |controller|
69
+ controller.default_published_at
70
+ end
71
+
72
+ Sets a default value for the column when rendering the new form.
73
+
74
+
75
+ #### description
76
+
77
+ form[:publish].description = "Click this check box to publish this blog post."
78
+
79
+ Sets descriptive text that will appear next to the column's input.
80
+
81
+ #### image\_size
82
+
83
+ form[:image].image_size = '300x500'
84
+
85
+ By default, [Paperclip] and [FileColumn] image files are rendered at full-size in the form. To restrict their size, pass a size string to `image_size`.
86
+
87
+ #### input
88
+
89
+ form[:publish].input = :check_box
90
+
91
+ Currently supports `:check_box`, `:select`, `:text_area`, and `:us_state`. `:us_state` will render a drop-down with U.S. states.
92
+
93
+ #### nilify\_link
94
+
95
+ Date and datetime fields come with a javascript link the clears the value in the date or datetime selects. The text of this link is "Set \[column name\] to nil" by default, but you may want to customize this text:
96
+
97
+ form[:sale_starts_at].nilify_link = 'Not on sale'
98
+
99
+
100
+ #### read\_only
101
+
102
+ a.form[:comment].read_only
103
+
104
+ If this is set, the given column will only be displayed, and not editable.
105
+
106
+
107
+ #### select\_choices
108
+
109
+ form[:admin_level].select_choices = %w(normal admin superuser)
110
+
111
+ Uses this with select inputs to set or override what is passed to Rails' `select` method as its `choices` argument.
112
+
113
+
114
+ #### select\_options
115
+
116
+ form[:user].select_options = {:include_blank => false}
117
+
118
+ Use this with belongs-to associations to tell admin\_assistant how to configure the `select` dropdown for the associated field. By default, this is set to `{:include_blank => true}`.
119
+
120
+ #### text\_area\_options
121
+
122
+ form[:body].text_area_options = {:cols => 20, :rows => 40}
123
+
124
+ Sets options to pass through to the text area that will be rendered for this column.
125
+
126
+ #### write\_once
127
+
128
+ form[:body].write_once
129
+
130
+ If this is set, the given column will only be editable on the new page, not on the edit page.
131
+
132
+
133
+ ### Controller methods
134
+
135
+ #### after\_save
136
+
137
+ Runs after the record is saved.
138
+
139
+ #### before\_create
140
+
141
+ Runs before the record is created.
142
+
143
+ #### before\_save
144
+
145
+ def before_save(blog_post)
146
+ if params[:blog_post][:publish] && blog_post.published_at.nil?
147
+ blog_post.published_at = Time.now.utc
148
+ end
149
+ end
150
+
151
+ Runs before the record is saved.
152
+
153
+ #### before\_update
154
+
155
+ Runs before the record is updated.
156
+
157
+
158
+ #### before\_validation
159
+
160
+ Runs before the record is validated.
161
+
162
+
163
+ #### \[column\]\_exists?
164
+
165
+ Used for image fields in generating form pages. If this method exists on the controller, it will be called to see if the image exists. You'll probably use this in conjunction with `[column]_url` and `destroy_[column]_in_attributes`.
166
+
167
+ def tmp_avatar_exists?(user)
168
+ user.has_avatar?
169
+ end
170
+
171
+ #### \[column\]\_url
172
+
173
+ Used for image fields in generating form pages. If the existing record has an image, and this method exists on the controller, it will be called to get the URL that should be rendered. You'll probably use this in conjunction with `[column]_exists?` and `destroy_[column]_in_attributes`.
174
+
175
+ def tmp_avatar_url(user)
176
+ "http://my-image-server.com/users/#{user.id}.jpg?v=#{user.avatar_version}"
177
+ end
178
+
179
+
180
+
181
+ #### \[column\]\_from\_form
182
+
183
+ def tags_from_form(tags_strings)
184
+ tags_strings.split(/\s+/).map { |tag_str|
185
+ Tag.find_by_tag(tag_str) || Tag.create(:tag => tag_str)
186
+ }
187
+ end
188
+
189
+ Should return a value suitable for assignment. In the above example, a BlogPost has-many tags, and the method tags\_from\_form will turn the string `"funny, video, lolcat"` into an array of three Tag model records, so admin\_assistant can set BlogPost#tags to that array.
190
+
191
+ If you need to return a value from another parameter, you can accept a second argument, which will be the params hash for the record.
192
+
193
+ def title_from_form(title_str, record_params)
194
+ if title_str.blank?
195
+ record_params[:title_alt]
196
+ else
197
+ title_str
198
+ end
199
+ end
200
+
201
+ If the value being returned is meant to be assigned through an association, you may find it useful to return custom errors to work around the strangeness of ActiveRecord's association-assignment error-handling. So admin\_assistant lets you optionally take a 3rd errors argument, which you can use to attach errors to the core model. This error object isn't returned, but changes to it will persist outside the body of the method.
202
+
203
+ def tags_from_form(tags_string, record_params, errors)
204
+ tags = tags_string.split(/\s+/).map { |tag_str|
205
+ Tag.find_by_tag(tag_str) || Tag.create(:tag => tag_str)
206
+ }
207
+ if tags.any? { |t| !t.valid? }
208
+ errors.add(:tags, "One or more tags was invalid")
209
+ end
210
+ tags
211
+ end
212
+
213
+
214
+
215
+
216
+ #### destination\_after\_save
217
+
218
+ def destination_after_save(blog_post, params)
219
+ if params[:commit] == 'Preview'
220
+ {:action => 'edit', :id => blog_post.id, :preview => '1'}
221
+ end
222
+ end
223
+
224
+ This method should return a hash to redirect to after a successful save. If it returns nil, the default is to return to the index page.
225
+
226
+ #### destroy\_\[column\]\_in\_attributes
227
+
228
+ Used for image fields. If a file field already exists, and the user clicks on the checkbox to delete this file, this method will be called if it's defined. You'll probably use this in conjunction with `[column]_exists?` and `[column]_exists?`.
229
+
230
+ def destroy_tmp_avatar_in_attributes(attributes)
231
+ attributes[:has_avatar] = false
232
+ end
233
+
234
+
235
+ #### validate
236
+
237
+ Runs after the model's built-in validation, before admin\_assistant tries to save the model.
238
+
239
+
240
+ ### Helper methods
241
+
242
+ #### after\_\[column\]\_input
243
+
244
+ If this helper method is present, whatever text it returns will be rendered after the default input for the column in the form. Takes the record as its only argument. You can also create a partial named `_after_[column]_input.html.erb`.
245
+
246
+ def after_password_input(user)
247
+ if user.id
248
+ "Reset #{check_box_tag('reset_password')}"
249
+ end
250
+ end
251
+
252
+ #### \[column\]\_input
253
+
254
+ If this helper method is present, whatever text it returns will be rendered instead of the default input for the column in the form. If it returns nil, the default input will be rendered instead. Takes the record as its only argument.
255
+
256
+ def password_input(user)
257
+ if !user.id
258
+ "(autogenerated)"
259
+ end
260
+ end
261
+
262
+ You can also create a partial named `_[column]_input.html.erb`.
263
+
264
+ #### \[column\]\_string
265
+
266
+ If this helper method is present, its returned string will be rendered within a text field. Odds are you'll use this with the controller method `[column]_from_form`, above.
267
+
268
+ def tags_string(blog_post)
269
+ blog_post.tags.map { |tag| tag.tag }.join ' '
270
+ end
271
+
272
+
273
+ ### Partials
274
+
275
+ #### \_\[column\]\_input.html.erb
276
+
277
+ If this partial is present, it will be rendered instead of the default input for the column.
278
+
279
+ #### \_after\_\[column\]\_input.html.erb
280
+
281
+
282
+ If this partial is present, it will be rendered after the default input for the column. You can also use the helper method `after_[column]_input`.
283
+
284
+ #### \_after\_form.html.erb
285
+
286
+ If this partial is present in the controller's views directory, it will be rendered after the normal form.
287
+
288
+
289
+ [FileColumn]: http://www.kanthak.net/opensource/file_column/
290
+ [Paperclip]: http://thoughtbot.com/projects/paperclip
291
+
@@ -0,0 +1,286 @@
1
+ ---
2
+ layout: api
3
+ title: Index
4
+ ---
5
+
6
+ ![index](../img/blog_posts-index.png)
7
+
8
+ The index is the action that lets you view all records, with pagination and sorting. To customize it by getting the index builder inside of your admin\_assistant config:
9
+
10
+ class Admin::BlogPostsController < ApplicationController
11
+ admin_assistant_for BlogPost do |a|
12
+ a.index do |index|
13
+ index.columns :user, :title
14
+ index.sort_by 'published_at desc'
15
+ end
16
+ end
17
+ end
18
+
19
+ ### Index config options
20
+
21
+ #### actions
22
+
23
+ index.actions['All'] = {:all => '1'}
24
+
25
+ Adds more links to the upper-right hand-corner. By default there are two links there: "Search", and "New \[model name\]". If you have any other specific links to add, you can add them with index.actions, and they will be added to the right of those default two links.
26
+
27
+ #### cache\_total\_entries
28
+
29
+ index.cache_total_entries 12.hours
30
+
31
+ This is an optimization for large tables. Some databases are slow when trying to simply get the number of records in the table; but this number is required for any paginated view. If your index views are slow because of this, you should consider setting `cache_total_entries` to some amount of time. This will cache the count SQL request, so that the count will be slightly off for some period of time, but that probably doesn't matter if you have, for example, 150,000 users.
32
+
33
+
34
+ #### conditions
35
+
36
+ Specifies additional SQL that can restrict the records shown in the index view. This can be a simple string:
37
+
38
+ index.conditions "deleted_at is null"
39
+
40
+ It can also be a block that will be passed the params hash:
41
+
42
+ index.conditions do |params|
43
+ "deleted_at is null" unless params[:all]
44
+ end
45
+
46
+ This can also be accomplished with a protected controller method `conditions_for_index`; see below.
47
+
48
+ #### per\_page
49
+
50
+ index.per_page 100
51
+
52
+ By default, 25 rows per page will be shown. Set per\_page to set it to another number.
53
+
54
+ #### columns
55
+
56
+ index.columns :user, :title
57
+
58
+ If called, restricts which columns are shown. By default admin\_assistant will try to show all columns on the DB table, which will probably be too much if your table has a lot of columns.
59
+
60
+ Can also be used to add model methods that aren't database fields.
61
+
62
+ #### header
63
+
64
+ index.header do |params|
65
+ if params[:all]
66
+ "Blog posts (all)"
67
+ else
68
+ "Blog posts (unpublished)"
69
+ end
70
+ end
71
+
72
+ For customization the text at the top of the page; takes a block with params as its argument
73
+
74
+ #### include
75
+
76
+ index.include :users
77
+
78
+ Accepts one or more association names to be eagerly loaded by ActiveRecord.
79
+
80
+ <a name="builder_right_column_links"></a>
81
+ #### right\_column\_links
82
+
83
+ By default, there are two links on the right-hand side of the row for each model: "Edit" and "Show". You can add new ones by appending to `right_column_links`:
84
+
85
+ index.right_column_links << lambda { |blog_post|
86
+ [
87
+ "New comment for this blog post",
88
+ {:controller => '/admin/comments', :action => 'new',
89
+ :comment => {:blog_post_id => blog_post.id }}
90
+ ]
91
+ }
92
+
93
+ The lambda should receive the model and return a two-element array: The first element should be the text of the link and the second should be the URL parameters for that link.
94
+
95
+ See also the helper method [extra\_right\_column\_links\_for\_index](#helper_extra_right_column_links_for_index).
96
+
97
+ #### search
98
+
99
+ index.search :id, :title
100
+
101
+ Shortcut to Search [`columns`](/api/search.html#builder_columns) .
102
+
103
+ #### sort\_by
104
+
105
+ Sets the default sorting of records, which will be used unless the user has specified sorting by clicking any of the sort headers. This can be a SQL string:
106
+
107
+ index.sort_by 'published_at desc, id asc'
108
+
109
+ It can also just be a belongs-to association:
110
+
111
+ index.sort_by :user
112
+
113
+ In the case of a belongs-to association, by default it will search for fields called `name`, `title`, `login`, or `username` on the associated model and use that.
114
+
115
+ #### total\_entries
116
+
117
+ index.total_entries = do
118
+ BlogPost.cached_count
119
+ end
120
+
121
+ This block will be called during pagination to provide the total number of records. This can come in handy if you have a huge number of records and are finding the count(\*) SQL statement too expensive.
122
+
123
+ ### Column config options
124
+
125
+ There are also configurations that can be applied to specific columns in the index view.
126
+
127
+ #### ajax\_toggle
128
+
129
+ index[:textile].ajax_toggle = false
130
+
131
+ By default, all boolean fields displayed in the index can be toggled with an Ajax link. Set `ajax_toggle` to false to disable this behavior.
132
+
133
+ #### image\_size
134
+
135
+ index[:image].image_size = '300x500'
136
+
137
+ By default, [Paperclip] and [FileColumn] image files are rendered at full-size in the index. To restrict their size, pass a size string to `image_size`.
138
+
139
+
140
+ #### link\_to\_args
141
+
142
+ class Admin::BlogPostsController < ApplicationController
143
+ layout 'admin'
144
+
145
+ admin_assistant_for BlogPost do |aa|
146
+ aa.index[:user].link_to_args do |blog_post|
147
+ {:controller => 'admin/users', :action => 'edit',
148
+ :id => blog_post.user_id }
149
+ end
150
+ end
151
+ end
152
+
153
+
154
+ If you'd like this column to link somewhere from the index view, set this with a block that returns a hash for `url_for` when called.
155
+
156
+ Note that this block takes the base record as its argument, not the value of the specific column or association. In the example above, the base model is BlogPost, so the block is receiving a blog post, not the associated user.
157
+
158
+ ### Controller methods
159
+
160
+ #### before\_render\_for\_index
161
+
162
+ If defined on your controller, this hook is executed just before render takes place for the index action.
163
+
164
+ class Admin::BlogPostsController < ApplicationController
165
+ layout 'admin'
166
+
167
+ admin_assistant_for BlogPost
168
+
169
+ protected
170
+
171
+ # Blog post authors should not be visible if they have requested anonymity
172
+ def before_render_for_index
173
+ @index.records.each do |record|
174
+ record.author = nil if record.author.requested_anonymity?
175
+ end
176
+ end
177
+ end
178
+
179
+ #### conditions\_for\_index
180
+
181
+ def conditions_for_index
182
+ "deleted_at is null" unless params[:all]
183
+ end
184
+
185
+ Specifies additional SQL that can restrict the records shown in the index view.
186
+
187
+ Can also be set via `index.conditions`; see `conditions` above.
188
+
189
+ ### Helper methods
190
+
191
+ #### \[column\]\_html\_for\_index
192
+
193
+ def title_html_for_index(blog_post)
194
+ "TITLE #{blog_post.title.capitalize}"
195
+ end
196
+
197
+ If this method exists on the helper, it will be used to render the HTML shown in each row for the column in question. It takes the model as its only argument.
198
+
199
+ <a name="helper_extra_right_column_links_for_index"></a>
200
+ #### extra\_right\_column\_links\_for\_index
201
+
202
+ By default, there are two links on the right-hand side of the row for each model: "Edit" and "Show". You can add new ones by returning them from `extra_right_column_links_for_index`:
203
+
204
+ def extra_right_column_links_for_index(blog_post)
205
+ link_to(
206
+ 'New comment',
207
+ {
208
+ :controller => 'admin/comments', :action => 'new',
209
+ :comment => {:blog_post_id => blog_post.id}
210
+ }
211
+ )
212
+ end
213
+
214
+ Also see the builder method [right\_column\_links](#builder_right_column_links).
215
+
216
+ #### link\_to\_new\_in\_index?
217
+
218
+ The link to create a new record will be shown on the index view if there is a 'new' action for the controller (whether via admin\_assistant or otherwise). If you don't want the link generated, define a helper method like this:
219
+
220
+ def link_to_new_in_index?
221
+ false
222
+ end
223
+
224
+ #### link\_to\_search\_in\_index?
225
+
226
+ The link to the search form will be shown unless it is prevented using a define a helper method like this:
227
+
228
+ def link_to_search_in_index?
229
+ false
230
+ end
231
+
232
+ #### link\_to\_edit\_in\_index?
233
+
234
+ The edit link in the right column of each row will be shown if there is a 'edit' action for the controller (whether via admin\_assistant or otherwise). If you don't want the link generated, define a helper method like this:
235
+
236
+ def link_to_edit_in_index?(blog_post)
237
+ false
238
+ end
239
+
240
+ #### link\_to\_delete\_in\_index?
241
+
242
+ The delete link in the right column of each row will be shown if there is a 'destroy' action for the controller (whether via admin\_assistant or otherwise). If you don't want the link generated, define a helper method like this:
243
+
244
+ def link_to_delete_in_index?(blog_post)
245
+ false
246
+ end
247
+
248
+ #### link\_to\_show\_in\_index?
249
+
250
+ The show link in the right column of each row will be shown if there is a 'show' action for the controller (whether via admin\_assistant or otherwise). If you don't want the link generated, define a helper method like this:
251
+
252
+ def link_to_show_in_index?(blog_post)
253
+ false
254
+ end
255
+
256
+ #### \[column\]\_css\_class\_for\_index\_td
257
+
258
+ To add a css class to a table cell, define a helper method based on the name of the column:
259
+
260
+ def user_css_class_for_index_td(blog_post)
261
+ 'custom_td_css_class'
262
+ end
263
+
264
+ #### css\_class\_for\_index\_tr
265
+
266
+ To add a css class to a table row, define a helper method like so:
267
+
268
+ def css_class_for_index_tr(blog_post)
269
+ 'custom_tr_css_class'
270
+ end
271
+
272
+ ### Partials
273
+
274
+ #### \_after\_index.html.erb
275
+
276
+ If this partial is present, it will be rendered after the entire index HTML.
277
+
278
+ #### \_before\_index.html.erb
279
+
280
+ If this partial is present, it will be rendered before the entire index HTML.
281
+
282
+
283
+
284
+ [FileColumn]: http://www.kanthak.net/opensource/file_column/
285
+ [Paperclip]: http://thoughtbot.com/projects/paperclip
286
+