token_field 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (255) hide show
  1. checksums.yaml +5 -13
  2. data/README.md +142 -84
  3. data/Rakefile +11 -19
  4. data/lib/token_field/capybara/dsl.rb +2 -1
  5. data/lib/token_field/engine.rb +0 -4
  6. data/lib/token_field/form_builder.rb +18 -20
  7. data/lib/token_field/simple_form/token_input.rb +9 -2
  8. data/lib/token_field/version.rb +1 -1
  9. data/spec/dummy/app/controllers/categories_controller.rb +13 -4
  10. data/spec/dummy/app/controllers/items_controller.rb +8 -2
  11. data/spec/dummy/app/controllers/products_controller.rb +8 -2
  12. data/spec/dummy/app/models/category.rb +2 -3
  13. data/spec/dummy/app/models/item.rb +0 -2
  14. data/spec/dummy/app/models/product.rb +0 -1
  15. data/spec/dummy/app/models/product_has_category.rb +0 -2
  16. data/spec/dummy/config/application.rb +2 -6
  17. data/spec/dummy/config/boot.rb +1 -1
  18. data/spec/dummy/config/environments/development.rb +3 -7
  19. data/spec/dummy/config/environments/production.rb +4 -5
  20. data/spec/dummy/config/environments/test.rb +4 -4
  21. data/spec/dummy/config/initializers/strong_parameters.rb +5 -0
  22. data/spec/dummy/db/test.sqlite3 +0 -0
  23. data/spec/dummy/log/development.log +1084 -0
  24. data/spec/dummy/log/test.log +33351 -0
  25. data/spec/dummy/tmp/cache/assets/C4F/BA0/sprockets%2F5b842030b744954247b274d6b0d93f82 +0 -0
  26. data/spec/dummy/tmp/cache/assets/C50/830/sprockets%2Fc2b655a6a30432b76933792e517f5291 +0 -0
  27. data/spec/dummy/tmp/cache/assets/C68/F70/sprockets%2F03000591510dc6784ee531c103e66a7a +0 -0
  28. data/spec/dummy/tmp/cache/assets/C82/490/sprockets%2F2cea86012965b76f28b56b4522099f12 +0 -0
  29. data/spec/dummy/tmp/cache/assets/CCB/5D0/sprockets%2F2b021b5261218f4183021778bade6ddd +0 -0
  30. data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  31. data/spec/dummy/tmp/cache/assets/CE1/B10/sprockets%2Fdced6804c57d3153294a01249ef867d0 +0 -0
  32. data/spec/dummy/tmp/cache/assets/CE4/CC0/sprockets%2F8c39c0da3443b6824828ee0e2297f2e3 +0 -0
  33. data/spec/dummy/tmp/cache/assets/D0F/700/sprockets%2Fb728373cb12011fa141dfc9a8386ef89 +0 -0
  34. data/spec/dummy/tmp/cache/assets/D10/FF0/sprockets%2F47a90636516eb46fc041d91c9be84b0f +0 -0
  35. data/spec/dummy/tmp/cache/assets/D2B/9F0/sprockets%2F573dcce95926d7e95dc3e7486716e41d +0 -0
  36. data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  37. data/spec/dummy/tmp/cache/assets/D3E/1E0/sprockets%2Fd3e4a0e0e469d4f2099f2991fc52bd10 +0 -0
  38. data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  39. data/spec/dummy/tmp/cache/assets/D56/E40/sprockets%2F55ac91700fc21cbc019fea2d206a16c8 +0 -0
  40. data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  41. data/spec/dummy/tmp/cache/assets/D7F/9E0/sprockets%2Fd984f45a60778c3cf14f1df92b0d9e6d +0 -0
  42. data/spec/dummy/tmp/cache/assets/DA5/100/sprockets%2F7d657d1d3bce59d08ee0cf74f16086ba +0 -0
  43. data/spec/dummy/tmp/cache/assets/DAC/370/sprockets%2F03a081dc7732cd2c4cbb10a57caa43ec +0 -0
  44. data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  45. data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  46. data/spec/dummy/tmp/cache/assets/E08/1C0/sprockets%2F686aa3aefb69a744730f9dfebc0d4c9e +0 -0
  47. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/2rD-NbfxL41ovM9Xofx6JQnSfJ1YMdzIYmeSGzqgjMk.cache +1 -0
  48. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/32VeAROUnaUkDhGuqKLXloInm3fe9_fjTbooXOx57XM.cache +2 -0
  49. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/3DagTfgMVVb9JxBG4iLcliCa_kH0l9M0SAhzNCCBfQQ.cache +1 -0
  50. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/48sb06ouBRT3bY-BupXDnd5qXrQrJYYYbAXkTBuI0a8.cache +0 -0
  51. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/6JDNR9zD4DtjzFf1hyPiiEon9u_4q-kv2hKkbSTOKoY.cache +0 -0
  52. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/8ULBNlT8C1Gc_sDisSvQ-cQOaOTmLgEyaB8uM_W6WoI.cache +1 -0
  53. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/A3QwKX3xKGHDk5tMn8k9HI6cyc18PVR9gvMxTQOb1tw.cache +1 -0
  54. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Ag-9zUKUAUzhaNKuJhbaGtA_BfsCD3h7HW9F4G3AYi0.cache +1 -0
  55. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/B5fzn4fNu7aOnX-IAVTHav_uDU0JusddQ-66VHDOGeg.cache +2 -0
  56. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/CWvkNWfDB2V38zgTquIZJL8Qe5lp6vIOTe0_z8Xl3Q4.cache +1 -0
  57. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/FYBkOwqnWjX-yaysXWh-8IkF6LTmhwYOrDYeeLZ3dlk.cache +1 -0
  58. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/JNp79x7ZpgHwaunFoF4dv1sGIguB6wRd_6RQcnmz8kY.cache +0 -0
  59. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Jx6P6ixJ_j1uk3Mj1icIc2tQT073xzCvTOBu2q8m-Sc.cache +1 -0
  60. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/KaajLDBcc-77MXLcThHHyjT1-4IPpcPOLAxDIsFxjXs.cache +2 -0
  61. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Lzl9vE-V9xIya_3axcQHEWd3YNq2Tf3koCy3y_9o_yw.cache +1 -0
  62. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/OYgl4AqQ-q2VErerOAM-WigjIi7rpYZ3MIxuFIgTmF4.cache +0 -0
  63. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/QsXmO1yQTZpNDvaQmVHJhkzFQN0bM_28ON1GzOZgWec.cache +0 -0
  64. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/UlxRCT-rTDSEhDN3bfyQBAXSFrQWp2mlKCAS2HETcIY.cache +1 -0
  65. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/W6sszOgRxSPAvmmgpsGDb-u0a5nk32xyj0W2gqOhd3U.cache +1 -0
  66. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Zkt3DLZYJaicRAFL-gICpW-tE8alGfVTEhe4OmjBd3A.cache +1 -0
  67. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/aAnvmFAGZ3EbIQ5RM4YXGC2n0HP0ybnC_hGd0UibKbw.cache +2 -0
  68. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/be--I6jKQ0Nsi2htKCIeLqZBsqeaikSH8RLYEi-8llw.cache +2 -0
  69. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/dmWSoZsO41NE0U2TnvucsI2YyZKB8o-jPThRqMEJMsg.cache +0 -0
  70. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/goT7oX_iTMYkLM8D6LO1Mj46F1lISf0rJuMJY5znOuk.cache +2 -0
  71. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/h75lgYw3sFnumOyzgDrK-WX10Th4yBYJqCXBwGj0GA8.cache +0 -0
  72. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/hRrID95UB4TJT_Z-tKyRJ5jYrSctS4WbIBZkhvsNOo4.cache +0 -0
  73. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/j42cv3HfgjE2xpgLWPrunf0JpnhuKPU0clTz23NaJ6k.cache +1 -0
  74. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/kIfchbDHQ-q7DjXik59-hTJYMz_O29qF1HBFlVtGAA4.cache +1 -0
  75. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/meuB_4gO5MG7zPbC47L7yqCtIqklHCfG3fi7Lo_t-2o.cache +1 -0
  76. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/nXwLVMSlsDyxT8qBnI-l7x3NuzvPWEvgzojgTq7jBlU.cache +0 -0
  77. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/qNUdz8c1b-Cgrs8NvON97j03sHMBVU303Px6rDpiD9A.cache +1 -0
  78. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/sL_zwz1wD0XfLf6_S6xDQ-YYWy-siUXYn-WqDXTr-5Q.cache +1 -0
  79. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/sqQDYCJgpbWaWVr_MSpR67txLpocCgsxgPlY3bfe78A.cache +2 -0
  80. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ttSzee3NzEUw4fJR-DaDHgNxB9C5v-_P7DU-5q0nWzQ.cache +2 -0
  81. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/v_r4UTYyOGjrLPeuR9ijVULXPblSQMoj2RQxKELv7II.cache +0 -0
  82. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/wgWNzf34hNQnH2QVgzgiToG1jjRb_EOggi4OynuhCxI.cache +2 -0
  83. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/2PMsEYFiByU7O0WmCBT5MwPvBGqqwjTp4cPl0H5nhxM.cache +1 -0
  84. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/2UxrjR9247T7qS95VDzg3c5sSbIiryheK5DziZR-ELk.cache +0 -0
  85. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/32VeAROUnaUkDhGuqKLXloInm3fe9_fjTbooXOx57XM.cache +2 -0
  86. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/3mg5tYlAiRxcpn2BaYYF1ROG4QCC0zz8Ez9HwzO3seA.cache +0 -0
  87. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/43Set6DYc8L9p5CNe35jGApTwPdGroBNxx8awVyt34I.cache +0 -0
  88. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/4aPukUfFkHfe-7F4cKKjqmfYDhZPj8Twr3ldCu-DmSY.cache +1 -0
  89. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/5FxT8u1nIWZlRwoew30GlRbPyfZWPemYw7O2I2E2eVQ.cache +1 -0
  90. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/7OWybKVj7HP-Ps-XPg9VskDwhFJ0mV_r2wBbYiV9OTY.cache +1 -0
  91. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/8wogN7wms9kD7qD5mXzaJWSJpEuKuQfic3jUCiWyYek.cache +2 -0
  92. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/A3QwKX3xKGHDk5tMn8k9HI6cyc18PVR9gvMxTQOb1tw.cache +1 -0
  93. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/AC7B_I-E6IcUjDVdXrkVJpQVQAtlAflyODbpJAQa254.cache +1 -0
  94. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/AEJzHztdSFs3riKL1JWyf4TxdTBMj76hIcSMJ4e5zFM.cache +1 -0
  95. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Ag-9zUKUAUzhaNKuJhbaGtA_BfsCD3h7HW9F4G3AYi0.cache +1 -0
  96. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/B5fzn4fNu7aOnX-IAVTHav_uDU0JusddQ-66VHDOGeg.cache +0 -0
  97. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/BydltyRa-wg1QS0OmxXH3GWdgM5RGsKykkz85aj09Ew.cache +0 -0
  98. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/CWvkNWfDB2V38zgTquIZJL8Qe5lp6vIOTe0_z8Xl3Q4.cache +1 -0
  99. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/CXPSxI0dfV9CRI7CJvyA9LMofi3oHiZOxgZZTJArK9U.cache +0 -0
  100. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/ClXeNs3e0mcYEcldY5k8ovzFSdWgt2bgjfrr59nMV3k.cache +0 -0
  101. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Dwo1k_n7pePnttDEp_W216_MJ-PY_DcIBTiK3gPzGyA.cache +1 -0
  102. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/DwuHLwTCZWGEMcda-ZFA545ebYglTK19r5DLbcI1_Ww.cache +0 -0
  103. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/EGoWVjwvSBGioUIVwMBewFuXzQnWnyGjLL93eLYAijw.cache +0 -0
  104. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/EkAATpfUxLtE5hjmldaQ9AXgSGnL6IxPWRXbVArpi0Y.cache +0 -0
  105. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/GubZLYRhsFZialV6g37NwU0IfZlR5XRZM70_tyadOg4.cache +0 -0
  106. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/HVas6MQEkZ21ydsdrXDmhQj0OVfkjKmejJaHrsMhQWw.cache +1 -0
  107. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/HZPH02ZLOslpuEko2k_loExL33bs6Vv8LYTAPoyywSA.cache +0 -0
  108. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/HzkJchCHtrEDvV4HRAbhXNcotyTfszQF4bj5Tg5bLcM.cache +1 -0
  109. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/JNp79x7ZpgHwaunFoF4dv1sGIguB6wRd_6RQcnmz8kY.cache +0 -0
  110. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/K8u_E6ZeuVnfBagZmruN-vp6yT-ZslaJg0ij9koiVOI.cache +1 -0
  111. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/KaajLDBcc-77MXLcThHHyjT1-4IPpcPOLAxDIsFxjXs.cache +0 -0
  112. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/LdIdja4QFlpJrJouR0TKiGxJ44PPf5bg73S3AyolZPs.cache +0 -0
  113. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/LiXd-XkCu_zzxEM56rf9Tr8dWsCeDRk3OmRoGQeztw0.cache +0 -0
  114. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/M4Yukv2yPTqN-q2g7qzwnEDxm1tiTB8tfRZdJd2BUBg.cache +1 -0
  115. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Mm3pl51V8EAzi1XRMY2rloMi51uz9q33A-d7HzrS_v4.cache +2 -0
  116. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/N2PqLZf6dTvu4ZEqGt7DLGKDRluBNkFOx7HE521Nk08.cache +0 -0
  117. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/OPHQPCVybpmyrpG-qH8wPxv_X_CxCxaA-uduQnP2Qqo.cache +1 -0
  118. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/OYgl4AqQ-q2VErerOAM-WigjIi7rpYZ3MIxuFIgTmF4.cache +0 -0
  119. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/QWoJs1ubrNrl9naTIounYhByDHKv1-AgVElHHE_lub0.cache +1 -0
  120. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/RyrOK8FHFiMxv1_D4AvoDkfOw513w40PrpCIbykzPq4.cache +1 -0
  121. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/T5FQV1xkXT1_yF34lXEaKxtrSdheHZXPRAxEFXf_ybE.cache +0 -0
  122. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/TAYZad6l_w-rKQ3uxMyxc0PXle0z7gmzIZbDVCc38O0.cache +0 -0
  123. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/UlxRCT-rTDSEhDN3bfyQBAXSFrQWp2mlKCAS2HETcIY.cache +1 -0
  124. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/V8zrq2aOTP1USFMzzIfa-7X8A7pMMxnXi7Mdt0d6o74.cache +1 -0
  125. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Vw4XMLemXAmeIx3RCtgaN7yXWNH4yekzKWOu_VcPMAM.cache +1 -0
  126. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/W6sszOgRxSPAvmmgpsGDb-u0a5nk32xyj0W2gqOhd3U.cache +1 -0
  127. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/WWhV6lUpBbGKFSV0E5wFdw1ayVmUQFdy_KxMHGitEjY.cache +2 -0
  128. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/XOXNsmXWsjJ675b5V1iSWZx4187tmf9RqxTN9tE45Bo.cache +1 -0
  129. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/YIZHJwrc-9zZmINXA816ubMYjdZCxRfsZnpRsuLM2GI.cache +0 -0
  130. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/YxupSbcbuQFGIa6MGDoIvdUqXCInXU9ZnhUKvVYvwKk.cache +1 -0
  131. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Zkt3DLZYJaicRAFL-gICpW-tE8alGfVTEhe4OmjBd3A.cache +1 -0
  132. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/aAnvmFAGZ3EbIQ5RM4YXGC2n0HP0ybnC_hGd0UibKbw.cache +2 -0
  133. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/aHNenO26RH5TedeJ8cSwhjt7YWUUuV9hNcUdGoTqy5U.cache +0 -0
  134. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/be--I6jKQ0Nsi2htKCIeLqZBsqeaikSH8RLYEi-8llw.cache +0 -0
  135. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/bmfw2RlM0hIII1Gvi2yb07QSsJPoqEXgIg33WkLHQY8.cache +2 -0
  136. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/eL-vrfG91Ydi3fR839qe-lWT_hrBWyuxdzxI7dhCcmk.cache +1 -0
  137. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/f8sxFWJgp6Xd20Cj46d-G3mwN0C8vTlj-1zAqEHRHJ8.cache +1 -0
  138. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/fQ9ydxpe64IJbz3ydey8tLbjp3f4iT6vgK86lBwWe-s.cache +1 -0
  139. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/fwtBCtx_UmYLfGGrwgp-_yl-E2-wgILUxrwNz7XM3JY.cache +0 -0
  140. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/goT7oX_iTMYkLM8D6LO1Mj46F1lISf0rJuMJY5znOuk.cache +2 -0
  141. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/hieVI5ID_7eMb50UwPqU41g4ADkOfSQud-4v5WpgMzc.cache +0 -0
  142. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/hnR1_z83xbWxBMga6Yao6j0KCRgaZrHLufPbjvnVdrE.cache +0 -0
  143. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/jcGhU0vX4q_sSH7WOyz6pyHxhhGjnFKzS_1hT-1eoRo.cache +1 -0
  144. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/jeP79U5A28hI_vDlJyUVGpScO8TEyNL3ANAo_uW4ptc.cache +1 -0
  145. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/jeo26N1rjV-rDuEwlRMZSes7MZEMWdFCLlojdIXN9MU.cache +2 -0
  146. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/kIfchbDHQ-q7DjXik59-hTJYMz_O29qF1HBFlVtGAA4.cache +1 -0
  147. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/kV7VF9y8TRSd9d572M-Tiwiw16GFV9x0R-GPvO8CuPk.cache +1 -0
  148. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/lIVfvNIkxhqH3uVqxOvlAWVD3LrXUaHBJrL1x9S-H9g.cache +1 -0
  149. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/lqUuCfH_d0qAJYApx4ch5ki8aidJdqnbMN-eta6oF0Q.cache +2 -0
  150. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/mFCuIJ6CIqrcHKR4XKbMYSJVIzVfs9wTJcHaqKleKNM.cache +2 -0
  151. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/meuB_4gO5MG7zPbC47L7yqCtIqklHCfG3fi7Lo_t-2o.cache +1 -0
  152. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/oH2yaWEGCOt43TtW97pxSIJ3rB4uV4yFTEjCSICgtG8.cache +0 -0
  153. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/omFfQ9zfC-WU5He9thtS1nVjTVQdk2FG6Nvc7OZKcBM.cache +0 -0
  154. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/oqoQKM8yw6sfaEkFPxPiZC74VHANhE-f9l06ZCvcHR0.cache +0 -0
  155. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/oui3rMLHEUREhi2LbR_K4eneGSjXZdKE5jH5hKDS5qs.cache +1 -0
  156. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/pdcXUpKtx6BpMd8kf8J6X9pIa_XsDIqFFubJ9S0ld4s.cache +1 -0
  157. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/ptuiOsXyfG474j_ZodR7t3jt3BYbWRVqByZkRtEPFrM.cache +1 -0
  158. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/qNUdz8c1b-Cgrs8NvON97j03sHMBVU303Px6rDpiD9A.cache +1 -0
  159. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/r5-UvyLJv7fQE_19swNC46TzvUqvwAGfh0NrTY30_VI.cache +1 -0
  160. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/sqQDYCJgpbWaWVr_MSpR67txLpocCgsxgPlY3bfe78A.cache +0 -0
  161. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/tQHmCY8zL5xURDpa6cDTUotPaBTg48qDNMdTwzGtUt4.cache +0 -0
  162. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/ttSzee3NzEUw4fJR-DaDHgNxB9C5v-_P7DU-5q0nWzQ.cache +0 -0
  163. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/u66nNDkNs8kGRDmtNPvbV-4edJoJz6yRw1lNkHRH4Wg.cache +1 -0
  164. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/wgWNzf34hNQnH2QVgzgiToG1jjRb_EOggi4OynuhCxI.cache +0 -0
  165. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/xeO4Rpi3GSrsOKh8uvFUKcYjX1mMA5gkndFWZ9y20dg.cache +1 -0
  166. data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/zUWIWAVmcgFqyoBjWyZGGFeglj5Js5lak_QfkdA_HmQ.cache +0 -0
  167. data/spec/dummy/tmp/capybara/capybara-201510261620025225892473.png +0 -0
  168. data/spec/dummy/tmp/capybara/capybara-201510261622495083432261.html +23 -0
  169. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-16-21-35.090.html +12 -0
  170. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-16-21-35.090.png +0 -0
  171. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-16-21-41.161.html +12 -0
  172. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-16-21-41.161.png +0 -0
  173. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-16-42-07.798.html +20 -0
  174. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-17-02-58.538.html +24 -0
  175. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-17-04-27.286.html +35 -0
  176. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-17-04-27.286.png +0 -0
  177. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-17-04-30.457.html +35 -0
  178. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-17-04-30.457.png +0 -0
  179. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-27.943.html +36 -0
  180. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-28.006.html +36 -0
  181. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-30.707.html +12 -0
  182. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-30.707.png +0 -0
  183. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-31.872.html +12 -0
  184. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-31.872.png +0 -0
  185. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-33.006.html +12 -0
  186. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-33.006.png +0 -0
  187. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-34.147.html +12 -0
  188. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-34.147.png +0 -0
  189. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-34.197.html +42 -0
  190. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-34.224.html +42 -0
  191. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-34.290.html +42 -0
  192. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-34.364.html +42 -0
  193. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-36.528.html +12 -0
  194. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-36.528.png +0 -0
  195. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-48.062.html +42 -0
  196. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-48.105.html +42 -0
  197. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-50.648.html +12 -0
  198. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-50.648.png +0 -0
  199. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-51.843.html +12 -0
  200. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-41-51.843.png +0 -0
  201. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-42-00.500.html +42 -0
  202. data/spec/dummy/tmp/capybara/screenshot_2015-10-26-19-43-20.297.html +42 -0
  203. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-02.547.html +12 -0
  204. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-02.547.png +0 -0
  205. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-04.728.html +12 -0
  206. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-04.728.png +0 -0
  207. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-04.800.html +42 -0
  208. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-04.841.html +42 -0
  209. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-04.934.html +12 -0
  210. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-04.934.png +0 -0
  211. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-05.025.html +12 -0
  212. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-05.025.png +0 -0
  213. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-05.088.html +0 -0
  214. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-05.130.html +0 -0
  215. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-06.269.html +12 -0
  216. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-06.269.png +0 -0
  217. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-07.413.html +12 -0
  218. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-07.413.png +0 -0
  219. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-07.472.html +42 -0
  220. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-00-07.504.html +42 -0
  221. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-05-02.626.html +0 -0
  222. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-05-02.690.html +0 -0
  223. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-05-04.519.html +12 -0
  224. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-05-04.519.png +0 -0
  225. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-05-04.598.html +12 -0
  226. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-05-04.598.png +0 -0
  227. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-05-11.531.html +12 -0
  228. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-05-11.531.png +0 -0
  229. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-05-11.636.html +42 -0
  230. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-06-04.435.html +12 -0
  231. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-06-04.435.png +0 -0
  232. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-06-04.521.html +12 -0
  233. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-06-04.521.png +0 -0
  234. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-06-04.583.html +0 -0
  235. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-06-04.615.html +0 -0
  236. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-09-02.245.html +12 -0
  237. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-09-02.245.png +0 -0
  238. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-09-03.056.html +12 -0
  239. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-09-03.056.png +0 -0
  240. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-09-03.545.html +0 -0
  241. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-09-03.991.html +0 -0
  242. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-12-45.485.html +12 -0
  243. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-12-45.485.png +0 -0
  244. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-12-46.689.html +12 -0
  245. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-12-46.689.png +0 -0
  246. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-12-47.220.html +0 -0
  247. data/spec/dummy/tmp/capybara/screenshot_2015-10-27-15-12-47.688.html +0 -0
  248. data/spec/features/autocomplete_with_dynamic_url_spec.rb +65 -0
  249. data/spec/features/many_to_many_tree_structore_spec.rb +68 -0
  250. data/spec/features/model_with_static_token_url_spec.rb +66 -0
  251. data/spec/spec_helper.rb +7 -2
  252. metadata +492 -38
  253. data/spec/requests/categories_spec.rb +0 -68
  254. data/spec/requests/items_spec.rb +0 -68
  255. data/spec/requests/products_spec.rb +0 -70
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NTI5YjFmOTgzY2U2OTY4MTk3N2QyYTY5NDRmNmVhZjI2NTc5NDU4ZQ==
5
- data.tar.gz: !binary |-
6
- ZTRjNjI2ZTM4Y2FkZmRmMWM4NTgxMTEwM2ZiZmZlMzJiZDdkYmMxZQ==
2
+ SHA1:
3
+ metadata.gz: 85d4b06c7b4116ae38a8e4400420b91994491213
4
+ data.tar.gz: 59d38c8bc49e6a5a19ac6dc0ceb8921f84ae6a03
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- ZDk5OTYzNjYyYzFhNTlmNGZjZDUwOWUwNjA5OGFjNjM5ZTA1ZTNiMjc5NDJl
10
- ZjI3NmJiNzVkYzU1ODVhMTVhNjg3M2U1MThhODA0MzdkMmZlNzAwNzBiMzg5
11
- NWVhOTk5YWNiMzA3ZDEyMGEwNzc1NTI5YTY2MTBlMGUyMWQ5ZGU=
12
- data.tar.gz: !binary |-
13
- MjBkNTBjOGViODIxYzgwMmNlNTdiNGQxZWIyNDIwMzZlMzE4M2FkMmY0YWFj
14
- MTllYjM0Y2VmYzI3NDJiMmI4MzYzZDVmNWU5NDgwOTY5ODQ3NmU1ZGYwNjZk
15
- MmE5NWMzN2RiMWI4ZGIwY2I1ZmM4ZGI1MmU2M2UyOTBiN2NjMGI=
6
+ metadata.gz: b9a360736e6de51ffd39393ac2a033135fe0ea0aa3948cbe88e4905b907ce13ff3196edcc3151afeda34c19aec630041906a4f7837ba955b1aced71dbbbdd80c
7
+ data.tar.gz: 51e877060b97959eccc7f7483678fdb8290e52f87e8ff814ca68ee45ac7774c1cb1d635a46c829f0afdfbc13b93bd1013e54508a5ce86b1e1f4d504520c845a1
data/README.md CHANGED
@@ -1,13 +1,23 @@
1
1
  # TokenField
2
2
 
3
- This gem add helper for form_for to Ruby on Rails 3.+
3
+ [![Build Status](https://travis-ci.org/mirrec/token_field.svg?branch=master)](https://travis-ci.org/mirrec/token_field)
4
+
5
+ This gem add helper for form_for to Ruby on Rails
4
6
  form_for helper for token input with jquery token input plugin
5
7
  for has_many and belongs_to association
6
8
 
7
9
  http://railscasts.com/episodes/258-token-fields
10
+
8
11
  http://loopj.com/jquery-tokeninput/
12
+
9
13
  https://github.com/foohey/jquery-tokeninput-rails
10
14
 
15
+ Supported Ruby on Rails versions:
16
+ * ~> 3.2.1
17
+ * ~> 4.0.1
18
+ * ~> 4.1.1
19
+ * ~> 4.2.1
20
+
11
21
  helper will render standard text field input with javascript.
12
22
  javascript will change standard input to token field input
13
23
 
@@ -15,8 +25,10 @@ javascript will change standard input to token field input
15
25
 
16
26
  Add this line to your application's Gemfile:
17
27
 
18
- gem "jquery-tokeninput-rails" # dependency
19
- gem "token_field"
28
+ ```ruby
29
+ gem 'jquery-tokeninput-rails' # dependency
30
+ gem 'token_field'
31
+ ```
20
32
 
21
33
  And then execute:
22
34
 
@@ -38,85 +50,105 @@ usage for tree
38
50
 
39
51
  we have a model Category like this
40
52
 
41
- class Category < ActiveRecord::Base
42
- attr_accessible :name, :parent_id
43
53
 
44
- has_many :categories, :foreign_key => :parent_id
45
- belongs_to :parent, :foreign_key => :parent_id, :class_name => "Category"
54
+ ```ruby
55
+ class Category < ActiveRecord::Base
56
+ attr_accessible :name, :parent_id
46
57
 
47
- # method for converting array of categories to array of hashes in format that token input accepts
48
- def self.token_json(items)
49
- items.map{|i| {:id => i.id, :name => i.name} }
50
- end
51
- end
58
+ has_many :categories, :foreign_key => :parent_id
59
+ belongs_to :parent, :foreign_key => :parent_id, :class_name => "Category"
60
+
61
+ # format that token input use
62
+ def to_token
63
+ {:id => id, :name => name}
64
+ end
65
+ end
66
+ ```
52
67
 
53
68
  we have action for responding for token input ajax calls, simple autocomplete
54
69
 
55
- class CategoriesController < ApplicationController
70
+ ```ruby
71
+ class CategoriesController < ApplicationController
56
72
 
57
- # action for autocomplete
58
- def token
59
- @categories = Category.where("categories.name like ?", "%#{params[:q]}%")
60
- respond_to do |format|
61
- format.json { render :json => Category.token_json(@categories) }
62
- end
63
- end
73
+ # action for autocomplete
74
+ def token
75
+ categories = Category.where("categories.name like ?", "%#{params[:q]}%")
64
76
 
65
- # rest of the class
66
- end
77
+ respond_to do |format|
78
+ format.json { render :json => categories.map(&:to_token) }
79
+ end
80
+ end
81
+
82
+ # rest of the class
83
+ end
84
+ ```
67
85
 
68
86
  in routes we have route for token ajax call
69
87
 
70
- MyApplication::Application.routes.draw do
71
- resources :categories do
72
- collection do
73
- get :token # route for token -> token_categories_path
74
- end
75
- end
88
+ ```ruby
89
+ MyApplication::Application.routes.draw do
90
+ resources :categories do
91
+ collection do
92
+ get :token # route for token -> token_categories_path
76
93
  end
94
+ end
95
+ end
96
+ ```
77
97
 
78
98
  then in view we call token_field with param :model => :category
79
99
 
80
- <%= form_for @category do |f| %>
81
- <%= f.token_field :parent_id, :model => :category, :token_url => token_categories_path %>
82
- <% end %>
100
+ ```erb
101
+ <%= form_for @category do |f| %>
102
+ <%= f.token_field :parent_id, :model => :category, :token_url => token_categories_path %>
103
+ <% end %>
104
+ ```
83
105
 
84
106
  in case model is in namespace for example MyApp you should use :model like this
85
107
 
86
- <%= form_for @category do |f| %>
87
- <%= f.token_field :parent_id, :model => "MyApp::Category", :token_url => token_categories_path %>
88
- <% end %>
108
+ ```erb
109
+ <%= form_for @category do |f| %>
110
+ <%= f.token_field :parent_id, :model => "MyApp::Category", :token_url => token_categories_path %>
111
+ <% end %>
112
+ ```
89
113
 
90
114
  if you need dynamically evaluated url of token input, you can pass inline javascript function to `:token_url` options but with `:token_url_is_function` set to `true`
91
115
 
92
- <%= form_for @category do |f| %>
93
- <%= f.token_field :parent_id, :model => :category, :token_url => "function(){ return '/hello' }", :token_url_is_function => true %>
94
- <% end %>
116
+ ```erb
117
+ <%= form_for @category do |f| %>
118
+ <%= f.token_field :parent_id, :model => :category, :token_url => "function(){ return '/hello' }", :token_url_is_function => true %>
119
+ <% end %>
120
+ ```
95
121
 
96
122
  also own separate function are supported
97
123
 
98
- <%= form_for @category do |f| %>
99
- <%= f.token_field :parent_id, :model => :category, :token_url => "myDynamicUrl", :token_url_is_function => true %>
100
- <% end %>
124
+ ```erb
125
+ <%= form_for @category do |f| %>
126
+ <%= f.token_field :parent_id, :model => :category, :token_url => "myDynamicUrl", :token_url_is_function => true %>
127
+ <% end %>
101
128
 
102
- <script type="text/javascript">
103
- function myDynamicUrl() {
104
- return "/my-url/";
105
- }
106
- </script>
129
+ <script type="text/javascript">
130
+ function myDynamicUrl() {
131
+ return "/my-url/";
132
+ }
133
+ </script>
134
+ ```
107
135
 
108
136
  if there would be model Parent, we can omit :model parameter.
109
137
  for example in Product model like this
110
138
 
111
- class Product < ActiveRecord::Base
112
- belongs_to :category
113
- end
139
+ ```ruby
140
+ class Product < ActiveRecord::Base
141
+ belongs_to :category
142
+ end
143
+ ```
114
144
 
115
145
  we can use this code in view
116
146
 
117
- <%= form_for @product do |f| %>
118
- <%= f.token_field :category_id, :token_url => token_categories_path %>
119
- <% end %>
147
+ ```erb
148
+ <%= form_for @product do |f| %>
149
+ <%= f.token_field :category_id, :token_url => token_categories_path %>
150
+ <% end %>
151
+ ```
120
152
 
121
153
  helper will allow you to enter only one element.
122
154
 
@@ -126,40 +158,48 @@ We can use token_input also for mapping categories to product
126
158
  we will use ActiveRecord method category_ids which be default return array of ids from association
127
159
  in model we have to change category_ids= method like this
128
160
 
129
- class Product < ActiveRecord::Base
130
- has_many :product_has_categories
131
- has_many :categories, :through => :product_has_categories
161
+ ```ruby
162
+ class Product < ActiveRecord::Base
163
+ has_many :product_has_categories
164
+ has_many :categories, :through => :product_has_categories
132
165
 
133
- alias_method :category_ids_old=, :category_ids=
134
- def category_ids=(ids)
135
- ids = ids.split(",").map(&:to_i) if ids.is_a?(String)
136
- self.category_ids_old=ids
137
- end
166
+ alias_method :category_ids_old=, :category_ids=
167
+ def category_ids=(ids)
168
+ ids = ids.split(",").map(&:to_i) if ids.is_a?(String)
169
+ self.category_ids_old=ids
170
+ end
138
171
 
139
- # rest of the class...
140
- end
172
+ # rest of the class...
173
+ end
174
+ ```
141
175
 
142
176
  in view you will use attribute category_ids. token input will expected more than one category.
143
177
  so you can enter more than one category.
144
178
 
145
- <%= form_for @product do |f| %>
146
- <%= f.token_field :category_ids, :token_url => token_categories_path %>
147
- <% end %>
179
+ ```erb
180
+ <%= form_for @product do |f| %>
181
+ <%= f.token_field :category_ids, :token_url => token_categories_path %>
182
+ <% end %>
183
+ ```
148
184
 
149
185
  if you want to use multiple token inputs on page, and id of element would be the same, you can user option :append_to_id.
150
186
 
151
- <%= form_for @product do |f| %>
152
- <%= f.token_field :category_ids, :token_url => token_categories_path, :append_to_id => :id %>
153
- <% end %>
187
+ ```erb
188
+ <%= form_for @product do |f| %>
189
+ <%= f.token_field :category_ids, :token_url => token_categories_path, :append_to_id => :id %>
190
+ <% end %>
191
+ ```
154
192
 
155
193
  if @product.id is present and for example "3" it will use this id and generate id of html input like this "product_categories_ids_3"
156
194
  if @product.id is nil id of html input will be "product_categories_ids"
157
195
 
158
196
  other value for :append_id option will be used like this
159
197
 
160
- <%= form_for @product do |f| %>
161
- <%= f.token_field :category_ids, :token_url => token_categories_path, :append_to_id => 5 %>
162
- <% end %>
198
+ ```erb
199
+ <%= form_for @product do |f| %>
200
+ <%= f.token_field :category_ids, :token_url => token_categories_path, :append_to_id => 5 %>
201
+ <% end %>
202
+ ```
163
203
 
164
204
  id of html input will be "product_categories_ids_5"
165
205
 
@@ -168,39 +208,57 @@ id of html input will be "product_categories_ids_5"
168
208
  if you use simple_form in your project, TokenInput field will be loaded.
169
209
  you can use it in view like this
170
210
 
171
- <%= simple_form_for(@item) do |f| %>
172
- <%= f.input :category_id, :as => :token, :token_url => token_categories_path %>
173
- <% end %>
211
+ ```erb
212
+ <%= simple_form_for(@item) do |f| %>
213
+ <%= f.input :category_id, :as => :token, :token_url => token_categories_path %>
214
+ <% end %>
215
+ ```
174
216
 
175
217
  all options for token_field helper can be used in simple form helper as well.
176
218
 
219
+ ## Updating from 1.x to 2.0
220
+
221
+ * Add `#to_token` method to model you are using
222
+ * Remove `.token_json` method, we don't use it anymore
223
+ * require dsl helper for tests (see below)
224
+
177
225
  ## Testing
178
226
 
179
227
  add support for helpers in rspec
180
228
 
181
- RSpec.configure do |config|
182
- config.include TokenField::Capybara::Dsl
183
- end
229
+ ```ruby
230
+ require 'token_field/capybara/dsl'
231
+
232
+ RSpec.configure do |config|
233
+ config.include TokenField::Capybara::Dsl
234
+ end
235
+ ```
184
236
 
185
237
  ### test helpers for capybara
186
238
 
187
239
  filling token input
188
240
 
189
- fill_in "category_parent_id", :with => new_parent.id # standard input
190
- fill_in_token "category_parent_id", :with => "wood"
241
+ ```ruby
242
+ fill_in "category_parent_id", :with => new_parent.id # standard input
243
+ fill_in_token "category_parent_id", :with => "wood"
244
+ fill_in_token "category_parent_id", :with => "wood", :waiting_call => lambda { sleep(4) }
245
+ ```
191
246
 
192
247
  clearing token input
193
248
 
194
- clear_token "category_parent_id"
249
+ ```ruby
250
+ clear_token "category_parent_id"
251
+ ```
195
252
 
196
253
  project is covered by integration tests. using rspec, capybara and selenium
197
254
  how to run test
198
255
 
199
- bundle # install dependency
200
- rake db:create
201
- rake db:migrate RAILS_ENV=test
202
- rspec spec/
203
-
256
+ ```bash
257
+ bundle # install dependency
258
+ rake db:create
259
+ rake db:migrate RAILS_ENV=test
260
+ rspec spec/
261
+ ```
204
262
 
205
263
  ## Contributing
206
264
 
data/Rakefile CHANGED
@@ -1,26 +1,18 @@
1
1
  #!/usr/bin/env rake
2
- begin
3
- require 'bundler/setup'
4
- rescue LoadError
5
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
- end
7
- begin
8
- require 'rdoc/task'
9
- rescue LoadError
10
- require 'rdoc/rdoc'
11
- require 'rake/rdoctask'
12
- RDoc::Task = Rake::RDocTask
13
- end
14
2
 
15
- RDoc::Task.new(:rdoc) do |rdoc|
16
- rdoc.rdoc_dir = 'rdoc'
17
- rdoc.title = 'TokenField'
18
- rdoc.options << '--line-numbers'
19
- rdoc.rdoc_files.include('README.rdoc')
20
- rdoc.rdoc_files.include('lib/**/*.rb')
21
- end
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+ require 'rake'
6
+ require 'rspec/core/rake_task'
22
7
 
23
8
  APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
24
9
  load 'rails/tasks/engine.rake'
25
10
 
26
11
  Bundler::GemHelper.install_tasks
12
+
13
+ begin
14
+
15
+ RSpec::Core::RakeTask.new(:spec)
16
+ task :default => :spec
17
+ rescue LoadError
18
+ end
@@ -2,8 +2,9 @@ module TokenField
2
2
  module Capybara
3
3
  module Dsl
4
4
  def fill_in_token(id, options)
5
+ waiting = options.fetch(:waiting_call) { lambda { sleep(1) } }
5
6
  fill_in "token-input-#{input_id(id, options)}", options
6
- sleep(1)
7
+ waiting.call
7
8
  find(".token-input-dropdown-facebook li").click
8
9
  end
9
10
 
@@ -11,9 +11,5 @@ module TokenField
11
11
  initializer "token_input" do
12
12
  require "token_field/simple_form/token_input" if defined?(SimpleForm)
13
13
  end
14
-
15
- initializer "token_field_test_helper" do
16
- require "token_field/capybara/dsl" if Rails.env.test?
17
- end
18
14
  end
19
15
  end
@@ -19,8 +19,8 @@ module TokenField
19
19
  # has_many :products
20
20
  #
21
21
  # # method for converting array of categories to array of hashes in format that token input accepts
22
- # def self.token_json(items)
23
- # items.map{|i| {:id => i.id, :name => i.name} }
22
+ # def to_token
23
+ # {:id => id, :name => name}
24
24
  # end
25
25
  # end
26
26
  #
@@ -34,9 +34,10 @@ module TokenField
34
34
  #
35
35
  # # action for autocomplete
36
36
  # def token
37
- # @categories = Category.where("categories.name like ?", "%#{params[:q]}%")
37
+ # categories = Category.where("categories.name like ?", "%#{params[:q]}%")
38
+ #
38
39
  # respond_to do |format|
39
- # format.json { render :json => Category.token_json(@categories) }
40
+ # format.json { render :json => categories.map(&:to_token) }
40
41
  # end
41
42
  # end
42
43
  #
@@ -92,20 +93,16 @@ module TokenField
92
93
  # end
93
94
  def token_field(attribute_name, options = {})
94
95
  association_type = @object.send(attribute_name).respond_to?(:each) ? :many : :one
95
- model_name = (options[:model] || attribute_name.to_s.gsub(/_ids?/, "")).to_s
96
+ model_name = options.fetch(:model) { attribute_name.to_s.gsub(/_ids?/, "") }.to_s
96
97
  association = attribute_name.to_s.gsub(/_ids?/, "").to_sym
97
- model = model_name.camelize.constantize
98
- token_url = options[:token_url]
98
+ token_url = options.fetch(:token_url) { "/#{model_name.pluralize}/token.json" }
99
99
  token_url_is_function = options.fetch(:token_url_is_function) { false }
100
100
  append_to_id = options[:append_to_id]
101
+ token_method = options.fetch(:token_method) { :to_token }
101
102
 
102
103
  token_limit = nil
103
104
  token_limit = 1 if association_type == :one
104
105
 
105
- if token_url.nil?
106
- token_url = "/#{model_name.pluralize}/token.json"
107
- end
108
-
109
106
  id = @object.send(:id)
110
107
 
111
108
  html_id = "#{@object_name}_#{attribute_name.to_s}"
@@ -116,16 +113,17 @@ module TokenField
116
113
  end
117
114
  html_id = html_id.parameterize.underscore
118
115
 
119
- value = nil
120
- data_pre = nil
121
- if association_type == :one && @object.send(association)
122
- data_pre = model.token_json([@object.send(association)]).to_json()
123
- value = @object.send(association).id
124
- elsif association_type == :many && @object.send(association.to_s.pluralize).count > 0
125
- data_pre = model.token_json(@object.send(association.to_s.pluralize)).to_json()
126
- value = @object.send(attribute_name).join(",")
116
+ results = []
117
+
118
+ if association_type == :one && @object.public_send(association)
119
+ results << @object.public_send(association)
120
+ elsif association_type == :many && @object.public_send(association.to_s.pluralize).count > 0
121
+ @object.public_send(association.to_s.pluralize).each { |record| results << record }
127
122
  end
128
123
 
124
+ data_pre = results.map{ |result| result.public_send(token_method) }
125
+ value = data_pre.map{ |row| row[:id] }.join(',')
126
+
129
127
  on_add = options[:on_add] ? "#{options[:on_add]}" : "false"
130
128
  on_delete = options[:on_delete] ? "#{options[:on_delete]}" : "false"
131
129
 
@@ -149,7 +147,7 @@ module TokenField
149
147
  });
150
148
  "
151
149
  script = content_tag(:script, js_content.html_safe, :type => Mime::JS)
152
- text_field("#{attribute_name}", "data-pre" => data_pre, :value => value, :id => html_id) + script
150
+ text_field("#{attribute_name}", "data-pre" => data_pre.to_json, :value => value, :id => html_id) + script
153
151
  end
154
152
  end
155
153
  end