token_field 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/README.md +16 -5
  2. data/lib/token_field/engine.rb +4 -0
  3. data/lib/token_field/simple_form/token_input.rb +13 -0
  4. data/lib/token_field/version.rb +1 -1
  5. data/spec/dummy/app/controllers/items_controller.rb +31 -0
  6. data/spec/dummy/app/models/item.rb +5 -0
  7. data/spec/dummy/app/views/items/_form.html.erb +6 -0
  8. data/spec/dummy/app/views/items/edit.html.erb +2 -0
  9. data/spec/dummy/app/views/items/index.html.erb +9 -0
  10. data/spec/dummy/app/views/items/new.html.erb +2 -0
  11. data/spec/dummy/config/initializers/simple_form.rb +142 -0
  12. data/spec/dummy/config/locales/simple_form.en.yml +26 -0
  13. data/spec/dummy/config/routes.rb +1 -0
  14. data/spec/dummy/db/development.sqlite3 +0 -0
  15. data/spec/dummy/db/migrate/20121013214019_create_items.rb +10 -0
  16. data/spec/dummy/db/schema.rb +8 -1
  17. data/spec/dummy/db/test.sqlite3 +0 -0
  18. data/spec/dummy/lib/templates/erb/scaffold/_form.html.erb +13 -0
  19. data/spec/dummy/log/development.log +279 -0
  20. data/spec/dummy/log/test.log +1513 -0
  21. data/spec/dummy/tmp/cache/assets/C68/F70/sprockets%2F03000591510dc6784ee531c103e66a7a +0 -0
  22. data/spec/dummy/tmp/cache/assets/C82/490/sprockets%2F2cea86012965b76f28b56b4522099f12 +0 -0
  23. data/spec/dummy/tmp/cache/assets/CCB/5D0/sprockets%2F2b021b5261218f4183021778bade6ddd +0 -0
  24. data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  25. data/spec/dummy/tmp/cache/assets/D0F/700/sprockets%2Fb728373cb12011fa141dfc9a8386ef89 +0 -0
  26. data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  27. data/spec/dummy/tmp/cache/assets/D3E/1E0/sprockets%2Fd3e4a0e0e469d4f2099f2991fc52bd10 +0 -0
  28. data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  29. data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  30. data/spec/dummy/tmp/cache/assets/D7F/9E0/sprockets%2Fd984f45a60778c3cf14f1df92b0d9e6d +0 -0
  31. data/spec/dummy/tmp/cache/assets/DA5/100/sprockets%2F7d657d1d3bce59d08ee0cf74f16086ba +0 -0
  32. data/spec/dummy/tmp/cache/assets/DAC/370/sprockets%2F03a081dc7732cd2c4cbb10a57caa43ec +0 -0
  33. data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  34. data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  35. data/spec/factories/factories.rb +4 -0
  36. data/spec/requests/items_spec.rb +68 -0
  37. metadata +26 -5
  38. data/spec/dummy/tmp/pids/server.pid +0 -1
data/README.md CHANGED
@@ -78,7 +78,7 @@ in routes we have route for token ajax call
78
78
  then in view we call token_field with param :model => :category
79
79
 
80
80
  <%= form_for @category do |f| %>
81
- <%= f.token_field :parent_id, :model => :category %>
81
+ <%= f.token_field :parent_id, :model => :category, :token_url => token_categories_path %>
82
82
  <% end %>
83
83
 
84
84
  if there would be model Parent, we can omit :model parameter.
@@ -91,7 +91,7 @@ for example in Product model like this
91
91
  we can use this code in view
92
92
 
93
93
  <%= form_for @product do |f| %>
94
- <%= f.token_field :category_id %>
94
+ <%= f.token_field :category_id, :token_url => token_categories_path %>
95
95
  <% end %>
96
96
 
97
97
  helper will allow you to enter only one element.
@@ -119,13 +119,13 @@ in view you will use attribute category_ids. token input will expected more than
119
119
  so you can enter more than one category.
120
120
 
121
121
  <%= form_for @product do |f| %>
122
- <%= f.token_field :category_ids %>
122
+ <%= f.token_field :category_ids, :token_url => token_categories_path %>
123
123
  <% end %>
124
124
 
125
125
  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.
126
126
 
127
127
  <%= form_for @product do |f| %>
128
- <%= f.token_field :category_ids, :append_to_id => :id %>
128
+ <%= f.token_field :category_ids, :token_url => token_categories_path, :append_to_id => :id %>
129
129
  <% end %>
130
130
 
131
131
  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"
@@ -134,11 +134,22 @@ if @product.id is nil id of html input will be "product_categories_ids"
134
134
  other value for :append_id option will be used like this
135
135
 
136
136
  <%= form_for @product do |f| %>
137
- <%= f.token_field :category_ids, :append_to_id => 5 %>
137
+ <%= f.token_field :category_ids, :token_url => token_categories_path, :append_to_id => 5 %>
138
138
  <% end %>
139
139
 
140
140
  id of html input will be "product_categories_ids_5"
141
141
 
142
+ ### SimpleForm support
143
+
144
+ if you use simple_form in your project, TokenInput field will be loaded.
145
+ you can use it in view like this
146
+
147
+ <%= simple_form_for(@item) do |f| %>
148
+ <%= f.input :category_id, :as => :token, :token_url => token_categories_path %>
149
+ <% end %>
150
+
151
+ all options for token_field helper can be used in simple form helper as well.
152
+
142
153
  ## Testing
143
154
 
144
155
  add support for helpers in rspec
@@ -7,5 +7,9 @@ module TokenField
7
7
  include TokenField::FormBuilder
8
8
  end
9
9
  end
10
+
11
+ initializer "token_input" do
12
+ require "token_field/simple_form/token_input" if defined?(SimpleForm)
13
+ end
10
14
  end
11
15
  end
@@ -0,0 +1,13 @@
1
+ require "simple_form/inputs/base"
2
+
3
+ class TokenInput < SimpleForm::Inputs::Base
4
+ #
5
+ # one:
6
+ # <%= f.input :category_id, :as => :token %>
7
+ #
8
+ # many:
9
+ # <%= f.input :category_ids, :as => :token %>
10
+ def input
11
+ @builder.token_field(attribute_name, options)
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module TokenField
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,31 @@
1
+ class ItemsController < ApplicationController
2
+ def index
3
+ @items = Item.all
4
+ end
5
+
6
+ def new
7
+ @item = Item.new
8
+ end
9
+
10
+ def create
11
+ @item = Item.new(params[:item])
12
+ if @item.save
13
+ redirect_to items_path
14
+ else
15
+ render :new
16
+ end
17
+ end
18
+
19
+ def edit
20
+ @item = Item.find(params[:id])
21
+ end
22
+
23
+ def update
24
+ @item = Item.find(params[:id])
25
+ if @item.update_attributes(params[:item])
26
+ redirect_to items_path
27
+ else
28
+ render :edit
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,5 @@
1
+ class Item < ActiveRecord::Base
2
+ attr_accessible :category_id, :name
3
+
4
+ belongs_to :category
5
+ end
@@ -0,0 +1,6 @@
1
+ <%= simple_form_for(@item) do |f| %>
2
+ <%= f.input :name %>
3
+ <%= f.input :category_id, :as => :token, :token_url => token_categories_path %>
4
+ <%= f.submit %>
5
+ <% end %>
6
+ <%= link_to "Listing", items_path %>
@@ -0,0 +1,2 @@
1
+ <h1>Item#edit</h1>
2
+ <%= render :partial => 'form' %>
@@ -0,0 +1,9 @@
1
+ <h1>Items</h1>
2
+ <%= link_to "New", new_item_path %>
3
+ <ul>
4
+ <% @items.each do |item| %>
5
+ <%= content_tag_for(:li, item) do %>
6
+ <%= item.name %> - <%= item.category_id %> <%= link_to "Edit", edit_item_path(item), :id => dom_id(item) %>
7
+ <% end %>
8
+ <% end %>
9
+ </ul>
@@ -0,0 +1,2 @@
1
+ <h1>Item#new</h1>
2
+ <%= render :partial => 'form' %>
@@ -0,0 +1,142 @@
1
+ # Use this setup block to configure all options available in SimpleForm.
2
+ SimpleForm.setup do |config|
3
+ # Wrappers are used by the form builder to generate a
4
+ # complete input. You can remove any component from the
5
+ # wrapper, change the order or even add your own to the
6
+ # stack. The options given below are used to wrap the
7
+ # whole input.
8
+ config.wrappers :default, :class => :input,
9
+ :hint_class => :field_with_hint, :error_class => :field_with_errors do |b|
10
+ ## Extensions enabled by default
11
+ # Any of these extensions can be disabled for a
12
+ # given input by passing: `f.input EXTENSION_NAME => false`.
13
+ # You can make any of these extensions optional by
14
+ # renaming `b.use` to `b.optional`.
15
+
16
+ # Determines whether to use HTML5 (:email, :url, ...)
17
+ # and required attributes
18
+ b.use :html5
19
+
20
+ # Calculates placeholders automatically from I18n
21
+ # You can also pass a string as f.input :placeholder => "Placeholder"
22
+ b.use :placeholder
23
+
24
+ ## Optional extensions
25
+ # They are disabled unless you pass `f.input EXTENSION_NAME => :lookup`
26
+ # to the input. If so, they will retrieve the values from the model
27
+ # if any exists. If you want to enable the lookup for any of those
28
+ # extensions by default, you can change `b.optional` to `b.use`.
29
+
30
+ # Calculates maxlength from length validations for string inputs
31
+ b.optional :maxlength
32
+
33
+ # Calculates pattern from format validations for string inputs
34
+ b.optional :pattern
35
+
36
+ # Calculates min and max from length validations for numeric inputs
37
+ b.optional :min_max
38
+
39
+ # Calculates readonly automatically from readonly attributes
40
+ b.optional :readonly
41
+
42
+ ## Inputs
43
+ b.use :label_input
44
+ b.use :hint, :wrap_with => { :tag => :span, :class => :hint }
45
+ b.use :error, :wrap_with => { :tag => :span, :class => :error }
46
+ end
47
+
48
+ # The default wrapper to be used by the FormBuilder.
49
+ config.default_wrapper = :default
50
+
51
+ # Define the way to render check boxes / radio buttons with labels.
52
+ # Defaults to :nested for bootstrap config.
53
+ # :inline => input + label
54
+ # :nested => label > input
55
+ config.boolean_style = :nested
56
+
57
+ # Default class for buttons
58
+ config.button_class = 'btn'
59
+
60
+ # Method used to tidy up errors. Specify any Rails Array method.
61
+ # :first lists the first message for each field.
62
+ # Use :to_sentence to list all errors for each field.
63
+ # config.error_method = :first
64
+
65
+ # Default tag used for error notification helper.
66
+ config.error_notification_tag = :div
67
+
68
+ # CSS class to add for error notification helper.
69
+ config.error_notification_class = 'alert alert-error'
70
+
71
+ # ID to add for error notification helper.
72
+ # config.error_notification_id = nil
73
+
74
+ # Series of attempts to detect a default label method for collection.
75
+ # config.collection_label_methods = [ :to_label, :name, :title, :to_s ]
76
+
77
+ # Series of attempts to detect a default value method for collection.
78
+ # config.collection_value_methods = [ :id, :to_s ]
79
+
80
+ # You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none.
81
+ # config.collection_wrapper_tag = nil
82
+
83
+ # You can define the class to use on all collection wrappers. Defaulting to none.
84
+ # config.collection_wrapper_class = nil
85
+
86
+ # You can wrap each item in a collection of radio/check boxes with a tag,
87
+ # defaulting to :span. Please note that when using :boolean_style = :nested,
88
+ # SimpleForm will force this option to be a label.
89
+ # config.item_wrapper_tag = :span
90
+
91
+ # You can define a class to use in all item wrappers. Defaulting to none.
92
+ # config.item_wrapper_class = nil
93
+
94
+ # How the label text should be generated altogether with the required text.
95
+ # config.label_text = lambda { |label, required| "#{required} #{label}" }
96
+
97
+ # You can define the class to use on all labels. Default is nil.
98
+ config.label_class = 'control-label'
99
+
100
+ # You can define the class to use on all forms. Default is simple_form.
101
+ # config.form_class = :simple_form
102
+
103
+ # You can define which elements should obtain additional classes
104
+ # config.generate_additional_classes_for = [:wrapper, :label, :input]
105
+
106
+ # Whether attributes are required by default (or not). Default is true.
107
+ # config.required_by_default = true
108
+
109
+ # Tell browsers whether to use default HTML5 validations (novalidate option).
110
+ # Default is enabled.
111
+ config.browser_validations = false
112
+
113
+ # Collection of methods to detect if a file type was given.
114
+ # config.file_methods = [ :mounted_as, :file?, :public_filename ]
115
+
116
+ # Custom mappings for input types. This should be a hash containing a regexp
117
+ # to match as key, and the input type that will be used when the field name
118
+ # matches the regexp as value.
119
+ # config.input_mappings = { /count/ => :integer }
120
+
121
+ # Custom wrappers for input types. This should be a hash containing an input
122
+ # type as key and the wrapper that will be used for all inputs with specified type.
123
+ # config.wrapper_mappings = { :string => :prepend }
124
+
125
+ # Default priority for time_zone inputs.
126
+ # config.time_zone_priority = nil
127
+
128
+ # Default priority for country inputs.
129
+ # config.country_priority = nil
130
+
131
+ # Default size for text inputs.
132
+ # config.default_input_size = 50
133
+
134
+ # When false, do not use translations for labels.
135
+ # config.translate_labels = true
136
+
137
+ # Automatically discover new inputs in Rails' autoload path.
138
+ # config.inputs_discovery = true
139
+
140
+ # Cache SimpleForm inputs discovery
141
+ # config.cache_discovery = !Rails.env.development?
142
+ end
@@ -0,0 +1,26 @@
1
+ en:
2
+ simple_form:
3
+ "yes": 'Yes'
4
+ "no": 'No'
5
+ required:
6
+ text: 'required'
7
+ mark: '*'
8
+ # You can uncomment the line below if you need to overwrite the whole required html.
9
+ # When using html, text and mark won't be used.
10
+ # html: '<abbr title="required">*</abbr>'
11
+ error_notification:
12
+ default_message: "Please review the problems below:"
13
+ # Labels and hints examples
14
+ # labels:
15
+ # defaults:
16
+ # password: 'Password'
17
+ # user:
18
+ # new:
19
+ # email: 'E-mail to sign in.'
20
+ # edit:
21
+ # email: 'E-mail.'
22
+ # hints:
23
+ # defaults:
24
+ # username: 'User name to sign in.'
25
+ # password: 'No special characters, please.'
26
+
@@ -6,6 +6,7 @@ Rails.application.routes.draw do
6
6
  end
7
7
  end
8
8
  resources :products
9
+ resources :items
9
10
 
10
11
  root :to => "categories#index"
11
12
  end
Binary file
@@ -0,0 +1,10 @@
1
+ class CreateItems < ActiveRecord::Migration
2
+ def change
3
+ create_table :items do |t|
4
+ t.string :name
5
+ t.integer :category_id
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended to check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(:version => 20121012235509) do
14
+ ActiveRecord::Schema.define(:version => 20121013214019) do
15
15
 
16
16
  create_table "categories", :force => true do |t|
17
17
  t.string "name"
@@ -20,6 +20,13 @@ ActiveRecord::Schema.define(:version => 20121012235509) do
20
20
  t.datetime "updated_at", :null => false
21
21
  end
22
22
 
23
+ create_table "items", :force => true do |t|
24
+ t.string "name"
25
+ t.integer "category_id"
26
+ t.datetime "created_at", :null => false
27
+ t.datetime "updated_at", :null => false
28
+ end
29
+
23
30
  create_table "product_has_categories", :force => true do |t|
24
31
  t.integer "product_id"
25
32
  t.integer "category_id"
Binary file
@@ -0,0 +1,13 @@
1
+ <%%= simple_form_for(@<%= singular_table_name %>) do |f| %>
2
+ <%%= f.error_notification %>
3
+
4
+ <div class="form-inputs">
5
+ <%- attributes.each do |attribute| -%>
6
+ <%%= f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %> %>
7
+ <%- end -%>
8
+ </div>
9
+
10
+ <div class="form-actions">
11
+ <%%= f.button :submit %>
12
+ </div>
13
+ <%% end %>
@@ -2846,3 +2846,282 @@ Served asset /application.js - 304 Not Modified (0ms)
2846
2846
 
2847
2847
  Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2012-10-13 12:36:31 +0200
2848
2848
  Served asset /jquery.js - 304 Not Modified (0ms)
2849
+ Connecting to database specified by database.yml
2850
+ Connecting to database specified by database.yml
2851
+  (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" 
2852
+ Migrating to CreateCategories (20121012100526)
2853
+ Migrating to CreateProducts (20121012235444)
2854
+ Migrating to CreateProductHasCategories (20121012235509)
2855
+ Migrating to CreateItems (20121013214019)
2856
+  (0.0ms) select sqlite_version(*)
2857
+  (0.0ms) begin transaction
2858
+  (0.4ms) CREATE TABLE "items" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "category_id" integer, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL)
2859
+  (24.0ms) INSERT INTO "schema_migrations" ("version") VALUES ('20121013214019')
2860
+  (12.1ms) commit transaction
2861
+  (0.3ms) select sqlite_version(*)
2862
+  (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations"
2863
+  (0.0ms) PRAGMA index_list("categories")
2864
+  (0.0ms) PRAGMA index_list("items")
2865
+  (0.0ms) PRAGMA index_list("product_has_categories")
2866
+  (0.0ms) PRAGMA index_list("products")
2867
+
2868
+
2869
+ Started GET "/" for 127.0.0.1 at 2012-10-13 23:46:33 +0200
2870
+ Connecting to database specified by database.yml
2871
+ Processing by CategoriesController#index as HTML
2872
+ Category Load (0.1ms) SELECT "categories".* FROM "categories" 
2873
+ Rendered categories/index.html.erb within layouts/application (5.5ms)
2874
+ Compiled token-input-facebook.css (0ms) (pid 3443)
2875
+ Compiled application.css (49ms) (pid 3443)
2876
+ Compiled jquery.js (4ms) (pid 3443)
2877
+ Compiled jquery_ujs.js (0ms) (pid 3443)
2878
+ Compiled jquery.tokeninput.js (0ms) (pid 3443)
2879
+ Compiled application.js (170ms) (pid 3443)
2880
+ Completed 200 OK in 505ms (Views: 454.5ms | ActiveRecord: 1.7ms)
2881
+
2882
+
2883
+ Started GET "/assets/application.css?body=1" for 127.0.0.1 at 2012-10-13 23:46:34 +0200
2884
+ Served asset /application.css - 200 OK (3ms)
2885
+
2886
+
2887
+ Started GET "/assets/token-input-facebook.css?body=1" for 127.0.0.1 at 2012-10-13 23:46:34 +0200
2888
+ Served asset /token-input-facebook.css - 200 OK (1ms)
2889
+
2890
+
2891
+ Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2012-10-13 23:46:34 +0200
2892
+ Served asset /jquery.js - 200 OK (3ms)
2893
+
2894
+
2895
+ Started GET "/assets/jquery_ujs.js?body=1" for 127.0.0.1 at 2012-10-13 23:46:34 +0200
2896
+ Served asset /jquery_ujs.js - 200 OK (1ms)
2897
+
2898
+
2899
+ Started GET "/assets/jquery.tokeninput.js?body=1" for 127.0.0.1 at 2012-10-13 23:46:34 +0200
2900
+ Served asset /jquery.tokeninput.js - 200 OK (1ms)
2901
+
2902
+
2903
+ Started GET "/assets/application.js?body=1" for 127.0.0.1 at 2012-10-13 23:46:34 +0200
2904
+ Served asset /application.js - 200 OK (4ms)
2905
+
2906
+
2907
+ Started GET "/items" for 127.0.0.1 at 2012-10-13 23:46:39 +0200
2908
+ Processing by ItemsController#index as HTML
2909
+ Item Load (0.1ms) SELECT "items".* FROM "items"
2910
+ Rendered items/index.html.erb within layouts/application (0.9ms)
2911
+ Completed 200 OK in 7ms (Views: 5.1ms | ActiveRecord: 0.3ms)
2912
+
2913
+
2914
+ Started GET "/items/new" for 127.0.0.1 at 2012-10-13 23:46:40 +0200
2915
+ Processing by ItemsController#new as HTML
2916
+ Rendered items/_form.html.erb (166.2ms)
2917
+ Rendered items/new.html.erb within layouts/application (194.1ms)
2918
+ Completed 500 Internal Server Error in 200ms
2919
+
2920
+ ActionView::Template::Error (No input found for token):
2921
+ 1: <%= simple_form_for(@item) do |f| %>
2922
+ 2: <%= f.input :name %>
2923
+ 3: <%= f.input :category_ids, :as => :token, :token_url => token_categories_path %>
2924
+ 4: <%= f.submit %>
2925
+ 5: <% end %>
2926
+ 6: <%= link_to "Listing", items_path %>
2927
+ app/views/items/_form.html.erb:3:in `block in _app_views_items__form_html_erb___1811428527127889752_2154073180'
2928
+ app/views/items/_form.html.erb:1:in `_app_views_items__form_html_erb___1811428527127889752_2154073180'
2929
+ app/views/items/new.html.erb:2:in `_app_views_items_new_html_erb__221201119574192906_2163567060'
2930
+
2931
+
2932
+ Rendered /Users/mirrec/.rvm/gems/ruby-1.9.3-head@wowbox/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.3ms)
2933
+ Rendered /Users/mirrec/.rvm/gems/ruby-1.9.3-head@wowbox/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.9ms)
2934
+ Rendered /Users/mirrec/.rvm/gems/ruby-1.9.3-head@wowbox/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (8.8ms)
2935
+
2936
+
2937
+ Started GET "/items/new" for 127.0.0.1 at 2012-10-13 23:56:41 +0200
2938
+ Connecting to database specified by database.yml
2939
+ Processing by ItemsController#new as HTML
2940
+ Rendered items/_form.html.erb (46.2ms)
2941
+ Rendered items/new.html.erb within layouts/application (50.4ms)
2942
+ Completed 500 Internal Server Error in 96ms
2943
+
2944
+ ActionView::Template::Error (undefined method `category_ids' for #<Item:0x00000101290390>):
2945
+ 1: <%= simple_form_for(@item) do |f| %>
2946
+ 2: <%= f.input :name %>
2947
+ 3: <%= f.input :category_ids, :as => :token, :token_url => token_categories_path %>
2948
+ 4: <%= f.submit %>
2949
+ 5: <% end %>
2950
+ 6: <%= link_to "Listing", items_path %>
2951
+ app/views/items/_form.html.erb:3:in `block in _app_views_items__form_html_erb___3681320351918761277_2156589100'
2952
+ app/views/items/_form.html.erb:1:in `_app_views_items__form_html_erb___3681320351918761277_2156589100'
2953
+ app/views/items/new.html.erb:2:in `_app_views_items_new_html_erb__2608424291861506679_2157462880'
2954
+
2955
+
2956
+ Rendered /Users/mirrec/.rvm/gems/ruby-1.9.3-head@wowbox/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.3ms)
2957
+ Rendered /Users/mirrec/.rvm/gems/ruby-1.9.3-head@wowbox/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.9ms)
2958
+ Rendered /Users/mirrec/.rvm/gems/ruby-1.9.3-head@wowbox/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (7.3ms)
2959
+
2960
+
2961
+ Started GET "/items/new" for 127.0.0.1 at 2012-10-13 23:57:48 +0200
2962
+ Processing by ItemsController#new as HTML
2963
+ Rendered items/_form.html.erb (56.4ms)
2964
+ Rendered items/new.html.erb within layouts/application (57.0ms)
2965
+ Completed 200 OK in 70ms (Views: 69.4ms | ActiveRecord: 0.0ms)
2966
+
2967
+
2968
+ Started GET "/assets/application.css?body=1" for 127.0.0.1 at 2012-10-13 23:57:48 +0200
2969
+ Served asset /application.css - 304 Not Modified (3ms)
2970
+
2971
+
2972
+ Started GET "/assets/token-input-facebook.css?body=1" for 127.0.0.1 at 2012-10-13 23:57:48 +0200
2973
+ Served asset /token-input-facebook.css - 304 Not Modified (2ms)
2974
+
2975
+
2976
+ Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2012-10-13 23:57:48 +0200
2977
+ Served asset /jquery.js - 304 Not Modified (5ms)
2978
+
2979
+
2980
+ Started GET "/assets/jquery_ujs.js?body=1" for 127.0.0.1 at 2012-10-13 23:57:48 +0200
2981
+ Served asset /jquery_ujs.js - 304 Not Modified (3ms)
2982
+
2983
+
2984
+ Started GET "/assets/jquery.tokeninput.js?body=1" for 127.0.0.1 at 2012-10-13 23:57:48 +0200
2985
+ Served asset /jquery.tokeninput.js - 304 Not Modified (1ms)
2986
+
2987
+
2988
+ Started GET "/assets/application.js?body=1" for 127.0.0.1 at 2012-10-13 23:57:48 +0200
2989
+ Served asset /application.js - 304 Not Modified (6ms)
2990
+
2991
+
2992
+ Started GET "/categories/token?q=n" for 127.0.0.1 at 2012-10-13 23:57:53 +0200
2993
+ Processing by CategoriesController#token as JSON
2994
+ Parameters: {"q"=>"n"}
2995
+ Category Load (0.1ms) SELECT "categories".* FROM "categories" WHERE (categories.name like '%n%')
2996
+ Completed 200 OK in 21ms (Views: 0.3ms | ActiveRecord: 0.3ms)
2997
+
2998
+
2999
+ Started POST "/items" for 127.0.0.1 at 2012-10-13 23:57:57 +0200
3000
+ Processing by ItemsController#create as HTML
3001
+ Parameters: {"utf8"=>"✓", "authenticity_token"=>"lo/p4qjRmxTh+URMUOGsKBCYsotN3l+4gMF97lGTIFQ=", "item"=>{"name"=>"polozka", "category_id"=>"1"}, "commit"=>"Create Item"}
3002
+  (0.1ms) begin transaction
3003
+ SQL (43.1ms) INSERT INTO "items" ("category_id", "created_at", "name", "updated_at") VALUES (?, ?, ?, ?) [["category_id", 1], ["created_at", Sat, 13 Oct 2012 21:57:57 UTC +00:00], ["name", "polozka"], ["updated_at", Sat, 13 Oct 2012 21:57:57 UTC +00:00]]
3004
+  (1.0ms) commit transaction
3005
+ Redirected to http://localhost:3000/items
3006
+ Completed 302 Found in 47ms (ActiveRecord: 44.1ms)
3007
+
3008
+
3009
+ Started GET "/items" for 127.0.0.1 at 2012-10-13 23:57:57 +0200
3010
+ Processing by ItemsController#index as HTML
3011
+ Item Load (0.2ms) SELECT "items".* FROM "items" 
3012
+ Rendered items/index.html.erb within layouts/application (1.9ms)
3013
+ Completed 500 Internal Server Error in 5ms
3014
+
3015
+ ActionView::Template::Error (undefined method `category_ids' for #<Item:0x000001011212c0>):
3016
+ 3: <ul>
3017
+ 4: <% @items.each do |item| %>
3018
+ 5: <%= content_tag_for(:li, item) do %>
3019
+ 6: <%= item.name %> - <%= item.category_ids.inspect %> <%= link_to "Edit", edit_item_path(item), :id => dom_id(item) %>
3020
+ 7: <% end %>
3021
+ 8: <% end %>
3022
+ 9: </ul>
3023
+ app/views/items/index.html.erb:6:in `block (2 levels) in _app_views_items_index_html_erb___1933584429465425982_2157446880'
3024
+ app/views/items/index.html.erb:5:in `block in _app_views_items_index_html_erb___1933584429465425982_2157446880'
3025
+ app/views/items/index.html.erb:4:in `each'
3026
+ app/views/items/index.html.erb:4:in `_app_views_items_index_html_erb___1933584429465425982_2157446880'
3027
+
3028
+
3029
+ Rendered /Users/mirrec/.rvm/gems/ruby-1.9.3-head@wowbox/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.1ms)
3030
+ Rendered /Users/mirrec/.rvm/gems/ruby-1.9.3-head@wowbox/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.8ms)
3031
+ Rendered /Users/mirrec/.rvm/gems/ruby-1.9.3-head@wowbox/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (6.6ms)
3032
+
3033
+
3034
+ Started GET "/items" for 127.0.0.1 at 2012-10-13 23:58:27 +0200
3035
+ Processing by ItemsController#index as HTML
3036
+ Item Load (0.1ms) SELECT "items".* FROM "items"
3037
+ Rendered items/index.html.erb within layouts/application (1.4ms)
3038
+ Completed 200 OK in 6ms (Views: 5.4ms | ActiveRecord: 0.1ms)
3039
+
3040
+
3041
+ Started GET "/assets/token-input-facebook.css?body=1" for 127.0.0.1 at 2012-10-13 23:58:27 +0200
3042
+ Served asset /token-input-facebook.css - 304 Not Modified (0ms)
3043
+
3044
+
3045
+ Started GET "/assets/application.css?body=1" for 127.0.0.1 at 2012-10-13 23:58:27 +0200
3046
+ Served asset /application.css - 304 Not Modified (0ms)
3047
+
3048
+
3049
+ Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2012-10-13 23:58:27 +0200
3050
+ Served asset /jquery.js - 304 Not Modified (0ms)
3051
+
3052
+
3053
+ Started GET "/assets/jquery_ujs.js?body=1" for 127.0.0.1 at 2012-10-13 23:58:27 +0200
3054
+ Served asset /jquery_ujs.js - 304 Not Modified (0ms)
3055
+
3056
+
3057
+ Started GET "/assets/jquery.tokeninput.js?body=1" for 127.0.0.1 at 2012-10-13 23:58:27 +0200
3058
+ Served asset /jquery.tokeninput.js - 304 Not Modified (0ms)
3059
+
3060
+
3061
+ Started GET "/assets/application.js?body=1" for 127.0.0.1 at 2012-10-13 23:58:27 +0200
3062
+ Served asset /application.js - 304 Not Modified (0ms)
3063
+
3064
+
3065
+ Started GET "/items/1/edit" for 127.0.0.1 at 2012-10-13 23:58:28 +0200
3066
+ Processing by ItemsController#edit as HTML
3067
+ Parameters: {"id"=>"1"}
3068
+ Item Load (0.2ms) SELECT "items".* FROM "items" WHERE "items"."id" = ? LIMIT 1 [["id", "1"]]
3069
+ Category Load (0.2ms) SELECT "categories".* FROM "categories" WHERE "categories"."id" = 1 LIMIT 1
3070
+ Rendered items/_form.html.erb (32.3ms)
3071
+ Rendered items/edit.html.erb within layouts/application (33.2ms)
3072
+ Completed 200 OK in 39ms (Views: 36.8ms | ActiveRecord: 0.4ms)
3073
+
3074
+
3075
+ Started GET "/assets/application.css?body=1" for 127.0.0.1 at 2012-10-13 23:58:28 +0200
3076
+ Served asset /application.css - 304 Not Modified (0ms)
3077
+
3078
+
3079
+ Started GET "/assets/token-input-facebook.css?body=1" for 127.0.0.1 at 2012-10-13 23:58:28 +0200
3080
+ Served asset /token-input-facebook.css - 304 Not Modified (0ms)
3081
+
3082
+
3083
+ Started GET "/assets/jquery.tokeninput.js?body=1" for 127.0.0.1 at 2012-10-13 23:58:28 +0200
3084
+ Served asset /jquery.tokeninput.js - 304 Not Modified (0ms)
3085
+
3086
+
3087
+ Started GET "/assets/application.js?body=1" for 127.0.0.1 at 2012-10-13 23:58:28 +0200
3088
+ Served asset /application.js - 304 Not Modified (0ms)
3089
+
3090
+
3091
+ Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2012-10-13 23:58:28 +0200
3092
+ Served asset /jquery.js - 304 Not Modified (0ms)
3093
+
3094
+
3095
+ Started GET "/assets/jquery_ujs.js?body=1" for 127.0.0.1 at 2012-10-13 23:58:28 +0200
3096
+ Served asset /jquery_ujs.js - 304 Not Modified (0ms)
3097
+
3098
+
3099
+ Started GET "/items" for 127.0.0.1 at 2012-10-13 23:58:30 +0200
3100
+ Processing by ItemsController#index as HTML
3101
+ Item Load (0.1ms) SELECT "items".* FROM "items" 
3102
+ Rendered items/index.html.erb within layouts/application (0.7ms)
3103
+ Completed 200 OK in 5ms (Views: 4.4ms | ActiveRecord: 0.1ms)
3104
+
3105
+
3106
+ Started GET "/assets/application.css?body=1" for 127.0.0.1 at 2012-10-13 23:58:30 +0200
3107
+ Served asset /application.css - 304 Not Modified (0ms)
3108
+
3109
+
3110
+ Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2012-10-13 23:58:30 +0200
3111
+ Served asset /jquery.js - 304 Not Modified (0ms)
3112
+
3113
+
3114
+ Started GET "/assets/token-input-facebook.css?body=1" for 127.0.0.1 at 2012-10-13 23:58:30 +0200
3115
+ Served asset /token-input-facebook.css - 304 Not Modified (0ms)
3116
+
3117
+
3118
+ Started GET "/assets/jquery_ujs.js?body=1" for 127.0.0.1 at 2012-10-13 23:58:30 +0200
3119
+ Served asset /jquery_ujs.js - 304 Not Modified (0ms)
3120
+
3121
+
3122
+ Started GET "/assets/application.js?body=1" for 127.0.0.1 at 2012-10-13 23:58:30 +0200
3123
+ Served asset /application.js - 304 Not Modified (0ms)
3124
+
3125
+
3126
+ Started GET "/assets/jquery.tokeninput.js?body=1" for 127.0.0.1 at 2012-10-13 23:58:30 +0200
3127
+ Served asset /jquery.tokeninput.js - 304 Not Modified (0ms)