anecdote 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/anecdote.rb +39 -5
- data/lib/anecdote/version.rb +1 -1
- data/test/dummy/app/controllers/pages_controller.rb +1 -1
- data/test/dummy/app/views/pages/article.markdown +2 -0
- data/test/dummy/config/application.rb +2 -2
- data/test/dummy/log/development.log +664 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/1P/1Pz01ZXNo9_vYgnmxRoFc3ULu6AxO1oPEq3aE5X6ec8.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/3p/3PMa_HxgneQK4BPMf5i3A7EGGsEMgU6TfFiwxSvtqjI.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/4G/4G0mpXtfrWmMS28AZz18kkDHddRBtbI83144qLIpVTg.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/5T/5TJUEytTrhfOrIAqpFxIBANjLVa00N2L7_0Yr4VZuis.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/74/74ZwKv9XBrP8zpauGSQ5qfi-6k_KOT68ZWfRkPyPPmM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/7Z/7ZCfr2c3CAA8TsyXVSn1cO1NSpQ3mkNsl-BepETYl44.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/8_/8_atagoS7ZRlinmmnn0xX55ZOycFS8yPqCXkj_9bvtY.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/96/96XFxM7FsRlikkOmobZxoVgvMw8WnoimVkw1lZ0kw-g.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/9k/9ktNEG7BVMHb0MWApWjv3xKDH5Xsb5fYFYZGfV3_2Bg.cache +5 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/9q/9qeRyh9k42ye-puRNEgFO7qjG7vUFYVwHzt9fndlbIA.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/A9/A9-qnHyVbwf992qlBRswAJndDx8kx8RIanClwkYXCPQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/CZ/CZx_hJbzil3UohRQjBlWbpVBWiyBSYVL08gRGdQQcA4.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Cc/Cc5Sm0AFaCUDQ7H5u6jz4AAPd303cjeGyZ82EKhnWkI.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ci/Ciy5F0GeIOABc8xtzpfl0ffDjrMVZS6aJWvbejYgeGY.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/DF/DFw0gEQ-DyU1CSZXxwDS9GgEJHN5Fhr49bMzfTfwnUc.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/DX/Dx730oqxpizxFfOvc2Mm4uMp_mJ9BRhoJWNykKIT2a0.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/E2/E2fVMZ0qSKaZqRa0Kme_b0_sMWwVEDgc36xJAdsm_7c.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/FV/FVM8wbsKtllbwD4StYrI5ZvcPLVhSd0pavanL2Bt_jA.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Lm/LmwoXJ-ZTnTQgY8M8AacxWXQuETgEv-5-Bj8ygEqqLM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Lz/LzkZiRvxSekvjbO6c1TuFDV4dKqX3Xr891PW9EQ8PHM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/OO/ooEmlipgCtrWCvQ4FmIxjAgDmaE8FjkMWrohwYkKRLk.cache +5 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ox/OxF7Z_LB0dYSRd2pSZ8CGjLnjk4OGKxERtyaX6RTsyA.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/PU/PUU8kSTBdyKbXkLqVlkSYDvgejKGrUxd7Ze1py2L98M.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Q6/q63n6pCVRuu8lnTKUlaxnTS0OBh3fDET6HxyTmd5KIM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/R6/R6nHR67ZwziXvkwea6OFPM-oUhyijpRfOaxSfvlSryw.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Si/SiwHub-1cTEaiKC_ER4FplRXgJ9wFF7uEH9sO--u7D4.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/VG/VGAfE5xaSnt9meajU2icPC_EhxtAxmvjbliCofR1VFo.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/WX/WX4M96HvLc2lBsh61Bu2f92NGGvgG0LM-85-uqTg0cs.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/XQ/XQTKOCvwunogH7TJKWV7nlQ41o8Skvv-jpH9Ue5VSjY.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/XT/xtUOLVSO7BUwtG6zhIse0VV42q29wWvR3ABlEBE6DX0.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Y7/Y77vjtthXMxQBROxDkRvCWCUpeTQByfRf7HsYJ_ZX8E.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Yr/YryzoIKn-imvtPp9lAXIpW3MqJClmVga3ufEcu_9qkg.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/cB/cB_Yjb4c9MjOAi4obvyjflYntyE9DlYYi181BtTtxdE.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/dM/dMOxvpf-tJhlvahbniuzCOmKLv5DL9p3RPNXW-DfOps.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/de/de0cAUGnJDlPRKVQyWgjgK_C-P-YAu137Gh3dv-2Tj8.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/g5/g5ku0smIw5-GG50-d0rqjtBCXkNiBC9YKapEkPO0Lug.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/gZ/Gz6DMFtX_FX8KmBdeGnmy5gQvmI10KyMIKvxX2wgD4M.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/gf/gfQBLRUVpLaqYdDEByHWddPl4lRe_dgESou6UA6-GN4.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/hQ/HQRSgnDqgJ0FGpGxYxnIO6F1_2gBcGdFl2zgiJSVlS4.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/iM/Im89yYn7SLB0GIEXcHzbmB7OUG_jGxUun0wzUMsMows.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/i_/i_V2h9znnkRTjk5hoqU4F2khDEg0EGBTHrhpbL2byHg.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/j9/j9IJr2zdIa7uf6-0hEA2Zds_hZc-Az81o6WExgU9W3Y.cache +4 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/jo/joqt6pEkRYOQWdAt2qAuDFpzpjxHsekm10u-j-uOhAs.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/p0/p0JF4Q1Be2MebSGmAWGwE-bhxMNSG8zO6axPSabz7Mo.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/pp/Pp0ksL8o_6oycLKbLAgtamP5jkYSs8f-jKp9KSuk_VI.cache +4 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/sb/sBWlxEzuRWEHo2ek8XwiyoDXTiCDQIXmBSu96y6-mWM.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ss/ssyCIBCyv3g7sBORebTf_iW3ca6rZ2S2aap0ahfUTk8.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/tE/tEiv_IIv80bAlPNYrAACMwXvuwrMnJLCzv11Szi-f5w.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/uB/uB1LDud0jjHIHNM1irIM5uv05mH62Sin9Ro36jZG5Do.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/vV/VVKpFYCP3NxX56fryqITbxbCqoR5JvRbWP3BMZoxQRM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/vk/vknrXy5ApvY2Zk2ceFlwul-A90ddY4H3vF3kXUoR8aw.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/x0/x0t54gya0sMCF2iEpw-sKnVfaOaEaJ9OCSNfiqKARP8.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/xy/XYYYiecLImOUwgEQtSuKjoa2P57RO78TY8jDewUqrAI.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ya/yAqnwLe0UKQJ6mVRkdfN3dzeUhxKiRXdZwtUO6xoYhU.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/yg/yg4JtJbe8i6m23Mi_dkCJSPndWd3wDbmWq0XSys4epk.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/zi/ZibtPdcH63zx34yfh1cW9UXfp-LzADG0DfJ7CmVZpZw.cache +1 -0
- metadata +92 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4b091ee11a7c20ea441716daf4484d830e66491
|
4
|
+
data.tar.gz: b8d639d1c828d888ca1e98c8844c1def2b9ac5e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35b16a6db55309e747cb1c587a264a4b8c4756a09c6efb58561f5f6b32ecc4cb044c94985c6dc8e24e33e0e84822fd51fc8259703e1f8cb32e18615b0bfa01aa
|
7
|
+
data.tar.gz: d9d6f5eb15a9426846757f667b926320cae31b1ac712da2218a5b268e58f3e7638949681f6080f2a7222facdb6701e73ed222df5dd9e0821ae2cefafa09f397f
|
data/lib/anecdote.rb
CHANGED
@@ -5,12 +5,12 @@ require "anecdote/engine"
|
|
5
5
|
|
6
6
|
module Anecdote
|
7
7
|
|
8
|
-
def self.markdown_and_parse(content="")
|
9
|
-
markdown_only( raconteur.parse(content) )
|
8
|
+
def self.markdown_and_parse(content="", options={})
|
9
|
+
markdown_only( raconteur.parse(content, options[:raconteur_options] || {}), options[:kramdown_options] )
|
10
10
|
end
|
11
11
|
|
12
|
-
def self.markdown_only(content)
|
13
|
-
::Kramdown::Document.new( content.presence
|
12
|
+
def self.markdown_only(content="", options={})
|
13
|
+
::Kramdown::Document.new( content.presence, { input: :GFM }.merge(options || {}) ).to_html.html_safe
|
14
14
|
end
|
15
15
|
|
16
16
|
def self.raconteur
|
@@ -47,7 +47,7 @@ module Anecdote
|
|
47
47
|
dimensions = settings[:dimensions].split('x').map(&:to_f)
|
48
48
|
geo = { width: dimensions.first, height: dimensions.last }
|
49
49
|
end
|
50
|
-
if settings[:_scope_].present? && settings[:_scope_][:processor].tag == 'gallery'
|
50
|
+
if settings[:_scope_].present? && settings[:_scope_].key?(:processor) && settings[:_scope_][:processor].tag == 'gallery'
|
51
51
|
settings[:_scope_][:settings][:_graphics_] ||= []
|
52
52
|
settings[:_scope_][:settings][:_graphics_] << geo
|
53
53
|
end
|
@@ -203,6 +203,39 @@ module Anecdote
|
|
203
203
|
view_context.content_tag(tag, markdown_and_parse_without_wrapping_tags(settings[:text] || settings[:_yield_]), module_wrapper_options(settings).merge(id: settings[:anchor], class: klasses.flatten.join(' ')))
|
204
204
|
end
|
205
205
|
})
|
206
|
+
|
207
|
+
|
208
|
+
raconteur.processors.register!('display-if', {
|
209
|
+
handler: lambda do |settings|
|
210
|
+
response = ''
|
211
|
+
# grab the 'format' provided to Anecdote for this particular call, or the default setting (if neither has been provdided, nothing is rendered)
|
212
|
+
if ( settings.key?([:_scope_]) && settings[:_scope_].key?(:format) ) || ( raconteur.settings.key?(:render_options) && raconteur.settings[:render_options].key?(:default_format) )
|
213
|
+
current_format = ( settings[:_scope_][:format] || raconteur.settings[:render_options][:default_format] ).to_s
|
214
|
+
sanctioned_formats = settings[:formats].split(',').map(&:to_s).select(&:present?)
|
215
|
+
# if the current format matches one of the formats "sanctioned" by the tag, render the content (otherwise, nothing is rendered)
|
216
|
+
if sanctioned_formats.include?(current_format)
|
217
|
+
response = settings[:_yield_]
|
218
|
+
end
|
219
|
+
end
|
220
|
+
response
|
221
|
+
end
|
222
|
+
})
|
223
|
+
raconteur.processors.register!('display-unless', {
|
224
|
+
handler: lambda do |settings|
|
225
|
+
response = settings[:_yield_]
|
226
|
+
# grab the 'format' provided to Anecdote for this particular call, or the default setting (if neither has been provided, the content is rendered)
|
227
|
+
if ( settings.key?([:_scope_]) && settings[:_scope_].key?(:format) ) || ( raconteur.settings.key?(:render_options) && raconteur.settings[:render_options].key?(:default_format) )
|
228
|
+
current_format = ( settings[:_scope_][:format] || raconteur.settings[:render_options][:default_format] ).to_s
|
229
|
+
unsanctioned_formats = settings[:formats].split(',').map(&:to_s).select(&:present?)
|
230
|
+
# if the current format matches one of the formats "unsanctioned" by the tag, nothing is rendered (otherwise, the content is rendered)
|
231
|
+
if unsanctioned_formats.include?(current_format)
|
232
|
+
response = ''
|
233
|
+
end
|
234
|
+
end
|
235
|
+
response
|
236
|
+
end
|
237
|
+
})
|
238
|
+
|
206
239
|
end
|
207
240
|
|
208
241
|
|
@@ -390,3 +423,4 @@ module Anecdote
|
|
390
423
|
end
|
391
424
|
|
392
425
|
Anecdote.init_raconteur
|
426
|
+
Anecdote.raconteur.settings[:render_options] = { default_format: :web }
|
data/lib/anecdote/version.rb
CHANGED
@@ -2,6 +2,6 @@ class PagesController < ApplicationController
|
|
2
2
|
def show
|
3
3
|
page = params[:id] || 'article'
|
4
4
|
file = File.read Rails.root.join('app', 'views', 'pages', "#{page}.markdown")
|
5
|
-
render
|
5
|
+
render html: Anecdote.markdown_and_parse(file), layout: 'application'
|
6
6
|
end
|
7
7
|
end
|
@@ -2,7 +2,9 @@
|
|
2
2
|
|
3
3
|
{{ graphic: href=//baymard.com + href-title=$Clicking this image will take you to Baymard.com!$ + assets-path=category-specific-sorting-01-rei-mock-up.jpg + size=full-width + caption=$This is the 3rd in a series of 9 articles based on research findings from our e-commerce [product list usability](http://baymard.com/research/ecommerce-product-lists study).$ }}
|
4
4
|
|
5
|
+
{{% display-if: formats=print,web %}}
|
5
6
|
We considered naming this article "the sort type all users want but zero sites offer" because category-specific sorting really is one of those rare instances where an obvious feature has somehow been **completely overlooked** by the e-commerce community.
|
7
|
+
{{% end %}}
|
6
8
|
|
7
9
|
{{ graphic: size=big + dimensions=1280x720 + embed-code=$<iframe src="https://www.youtube.com/embed/ZCBE8ocOkAQ" frameborder="0" allowfullscreen></iframe>$ + mood=positive + sidebar-caption=true + caption=$A mockup we've created of what category-specific sort types could look like at BestBuy. Here the three last sorting options – for TV screen size, refresh rate, and display depth – are available exclusively within the TV category while the other sort types are available site-wide.$ }}
|
8
10
|
|
@@ -11,7 +11,7 @@ module Dummy
|
|
11
11
|
# Application configuration should go into files in config/initializers
|
12
12
|
# -- all .rb files in that directory are automatically loaded.
|
13
13
|
config.middleware.insert_after ActionDispatch::Static, Rack::LiveReload
|
14
|
-
|
14
|
+
|
15
15
|
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
16
16
|
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
17
17
|
# config.time_zone = 'Central Time (US & Canada)'
|
@@ -21,6 +21,6 @@ module Dummy
|
|
21
21
|
# config.i18n.default_locale = :de
|
22
22
|
|
23
23
|
# Do not swallow errors in after_commit/after_rollback callbacks.
|
24
|
-
config.active_record.raise_in_transactional_callbacks = true
|
24
|
+
# config.active_record.raise_in_transactional_callbacks = true
|
25
25
|
end
|
26
26
|
end
|
@@ -46685,3 +46685,667 @@ DEPRECATION WARNING: `render :text` is deprecated because it does not actually r
|
|
46685
46685
|
Completed 200 OK in 472ms (Views: 8.4ms | ActiveRecord: 0.0ms)
|
46686
46686
|
|
46687
46687
|
|
46688
|
+
Started GET "/" for ::1 at 2017-12-14 11:32:12 +0100
|
46689
|
+
Processing by PagesController#show as HTML
|
46690
|
+
Completed 500 Internal Server Error in 1874ms
|
46691
|
+
|
46692
|
+
|
46693
|
+
|
46694
|
+
NoMethodError (undefined method `raise_in_transactional_callbacks=' for ActiveRecord::Base:Class):
|
46695
|
+
|
46696
|
+
activerecord (5.1.4) lib/active_record/dynamic_matchers.rb:22:in `method_missing'
|
46697
|
+
activerecord (5.1.4) lib/active_record/railtie.rb:112:in `block (3 levels) in <class:Railtie>'
|
46698
|
+
activerecord (5.1.4) lib/active_record/railtie.rb:111:in `each'
|
46699
|
+
activerecord (5.1.4) lib/active_record/railtie.rb:111:in `block (2 levels) in <class:Railtie>'
|
46700
|
+
activesupport (5.1.4) lib/active_support/lazy_load_hooks.rb:69:in `instance_eval'
|
46701
|
+
activesupport (5.1.4) lib/active_support/lazy_load_hooks.rb:69:in `block in execute_hook'
|
46702
|
+
activesupport (5.1.4) lib/active_support/lazy_load_hooks.rb:60:in `with_execution_control'
|
46703
|
+
activesupport (5.1.4) lib/active_support/lazy_load_hooks.rb:65:in `execute_hook'
|
46704
|
+
activesupport (5.1.4) lib/active_support/lazy_load_hooks.rb:50:in `block in run_load_hooks'
|
46705
|
+
activesupport (5.1.4) lib/active_support/lazy_load_hooks.rb:49:in `each'
|
46706
|
+
activesupport (5.1.4) lib/active_support/lazy_load_hooks.rb:49:in `run_load_hooks'
|
46707
|
+
activerecord (5.1.4) lib/active_record/base.rb:326:in `<module:ActiveRecord>'
|
46708
|
+
activerecord (5.1.4) lib/active_record/base.rb:25:in `<top (required)>'
|
46709
|
+
activesupport (5.1.4) lib/active_support/dependencies.rb:292:in `require'
|
46710
|
+
activesupport (5.1.4) lib/active_support/dependencies.rb:292:in `block in require'
|
46711
|
+
activesupport (5.1.4) lib/active_support/dependencies.rb:258:in `load_dependency'
|
46712
|
+
activesupport (5.1.4) lib/active_support/dependencies.rb:292:in `require'
|
46713
|
+
activerecord (5.1.4) lib/active_record/railties/controller_runtime.rb:40:in `append_info_to_payload'
|
46714
|
+
actionpack (5.1.4) lib/action_controller/metal/instrumentation.rb:36:in `ensure in block in process_action'
|
46715
|
+
actionpack (5.1.4) lib/action_controller/metal/instrumentation.rb:36:in `block in process_action'
|
46716
|
+
activesupport (5.1.4) lib/active_support/notifications.rb:166:in `block in instrument'
|
46717
|
+
activesupport (5.1.4) lib/active_support/notifications/instrumenter.rb:21:in `instrument'
|
46718
|
+
activesupport (5.1.4) lib/active_support/notifications.rb:166:in `instrument'
|
46719
|
+
actionpack (5.1.4) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
|
46720
|
+
actionpack (5.1.4) lib/action_controller/metal/params_wrapper.rb:252:in `process_action'
|
46721
|
+
activerecord (5.1.4) lib/active_record/railties/controller_runtime.rb:22:in `process_action'
|
46722
|
+
actionpack (5.1.4) lib/abstract_controller/base.rb:124:in `process'
|
46723
|
+
actionview (5.1.4) lib/action_view/rendering.rb:30:in `process'
|
46724
|
+
actionpack (5.1.4) lib/action_controller/metal.rb:189:in `dispatch'
|
46725
|
+
actionpack (5.1.4) lib/action_controller/metal.rb:253:in `dispatch'
|
46726
|
+
actionpack (5.1.4) lib/action_dispatch/routing/route_set.rb:49:in `dispatch'
|
46727
|
+
actionpack (5.1.4) lib/action_dispatch/routing/route_set.rb:31:in `serve'
|
46728
|
+
actionpack (5.1.4) lib/action_dispatch/journey/router.rb:50:in `block in serve'
|
46729
|
+
actionpack (5.1.4) lib/action_dispatch/journey/router.rb:33:in `each'
|
46730
|
+
actionpack (5.1.4) lib/action_dispatch/journey/router.rb:33:in `serve'
|
46731
|
+
actionpack (5.1.4) lib/action_dispatch/routing/route_set.rb:834:in `call'
|
46732
|
+
rack (2.0.3) lib/rack/etag.rb:25:in `call'
|
46733
|
+
rack (2.0.3) lib/rack/conditional_get.rb:25:in `call'
|
46734
|
+
rack (2.0.3) lib/rack/head.rb:12:in `call'
|
46735
|
+
rack (2.0.3) lib/rack/session/abstract/id.rb:232:in `context'
|
46736
|
+
rack (2.0.3) lib/rack/session/abstract/id.rb:226:in `call'
|
46737
|
+
actionpack (5.1.4) lib/action_dispatch/middleware/cookies.rb:613:in `call'
|
46738
|
+
activerecord (5.1.4) lib/active_record/migration.rb:556:in `call'
|
46739
|
+
actionpack (5.1.4) lib/action_dispatch/middleware/callbacks.rb:26:in `block in call'
|
46740
|
+
activesupport (5.1.4) lib/active_support/callbacks.rb:97:in `run_callbacks'
|
46741
|
+
actionpack (5.1.4) lib/action_dispatch/middleware/callbacks.rb:24:in `call'
|
46742
|
+
actionpack (5.1.4) lib/action_dispatch/middleware/executor.rb:12:in `call'
|
46743
|
+
actionpack (5.1.4) lib/action_dispatch/middleware/debug_exceptions.rb:59:in `call'
|
46744
|
+
actionpack (5.1.4) lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'
|
46745
|
+
railties (5.1.4) lib/rails/rack/logger.rb:36:in `call_app'
|
46746
|
+
railties (5.1.4) lib/rails/rack/logger.rb:24:in `block in call'
|
46747
|
+
activesupport (5.1.4) lib/active_support/tagged_logging.rb:69:in `block in tagged'
|
46748
|
+
activesupport (5.1.4) lib/active_support/tagged_logging.rb:26:in `tagged'
|
46749
|
+
activesupport (5.1.4) lib/active_support/tagged_logging.rb:69:in `tagged'
|
46750
|
+
railties (5.1.4) lib/rails/rack/logger.rb:24:in `call'
|
46751
|
+
actionpack (5.1.4) lib/action_dispatch/middleware/remote_ip.rb:79:in `call'
|
46752
|
+
actionpack (5.1.4) lib/action_dispatch/middleware/request_id.rb:25:in `call'
|
46753
|
+
rack (2.0.3) lib/rack/method_override.rb:22:in `call'
|
46754
|
+
rack (2.0.3) lib/rack/runtime.rb:22:in `call'
|
46755
|
+
activesupport (5.1.4) lib/active_support/cache/strategy/local_cache_middleware.rb:27:in `call'
|
46756
|
+
actionpack (5.1.4) lib/action_dispatch/middleware/executor.rb:12:in `call'
|
46757
|
+
rack-livereload (0.3.16) lib/rack/livereload.rb:23:in `_call'
|
46758
|
+
rack-livereload (0.3.16) lib/rack/livereload.rb:14:in `call'
|
46759
|
+
actionpack (5.1.4) lib/action_dispatch/middleware/static.rb:125:in `call'
|
46760
|
+
rack (2.0.3) lib/rack/sendfile.rb:111:in `call'
|
46761
|
+
railties (5.1.4) lib/rails/engine.rb:522:in `call'
|
46762
|
+
rack (2.0.3) lib/rack/handler/webrick.rb:86:in `service'
|
46763
|
+
/Users/jamieappleseed/.rbenv/versions/2.4.2/lib/ruby/2.4.0/webrick/httpserver.rb:140:in `service'
|
46764
|
+
/Users/jamieappleseed/.rbenv/versions/2.4.2/lib/ruby/2.4.0/webrick/httpserver.rb:96:in `run'
|
46765
|
+
/Users/jamieappleseed/.rbenv/versions/2.4.2/lib/ruby/2.4.0/webrick/server.rb:290:in `block in start_thread'
|
46766
|
+
Started GET "/" for ::1 at 2017-12-14 11:32:37 +0100
|
46767
|
+
Processing by PagesController#show as HTML
|
46768
|
+
Completed 500 Internal Server Error in 98ms
|
46769
|
+
|
46770
|
+
|
46771
|
+
|
46772
|
+
TypeError (no implicit conversion of nil into Hash):
|
46773
|
+
|
46774
|
+
app/controllers/pages_controller.rb:5:in `show'
|
46775
|
+
Started GET "/" for ::1 at 2017-12-14 11:32:40 +0100
|
46776
|
+
Processing by PagesController#show as HTML
|
46777
|
+
Completed 500 Internal Server Error in 54ms
|
46778
|
+
|
46779
|
+
|
46780
|
+
|
46781
|
+
TypeError (no implicit conversion of nil into Hash):
|
46782
|
+
|
46783
|
+
app/controllers/pages_controller.rb:5:in `show'
|
46784
|
+
Started GET "/" for ::1 at 2017-12-14 11:33:28 +0100
|
46785
|
+
Processing by PagesController#show as HTML
|
46786
|
+
Completed 500 Internal Server Error in 111ms
|
46787
|
+
|
46788
|
+
|
46789
|
+
|
46790
|
+
TypeError (no implicit conversion of nil into Hash):
|
46791
|
+
|
46792
|
+
app/controllers/pages_controller.rb:5:in `show'
|
46793
|
+
Started GET "/" for ::1 at 2017-12-14 11:33:43 +0100
|
46794
|
+
Processing by PagesController#show as HTML
|
46795
|
+
Completed 500 Internal Server Error in 1617ms
|
46796
|
+
|
46797
|
+
|
46798
|
+
|
46799
|
+
NoMethodError (undefined method `raise_in_transactional_callbacks=' for ActiveRecord::Base:Class):
|
46800
|
+
|
46801
|
+
app/controllers/pages_controller.rb:5:in `show'
|
46802
|
+
Started GET "/" for ::1 at 2017-12-14 11:33:54 +0100
|
46803
|
+
Processing by PagesController#show as HTML
|
46804
|
+
Completed 500 Internal Server Error in 587ms
|
46805
|
+
|
46806
|
+
|
46807
|
+
|
46808
|
+
ActionView::MissingTemplate (Missing template pages/show, application/show with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby]}. Searched in:
|
46809
|
+
* "/Users/jamieappleseed/Sites/baymard/plugins-and-scripts/anecdote/test/dummy/app/views"
|
46810
|
+
* "/Users/jamieappleseed/Sites/baymard/plugins-and-scripts/anecdote/app/views"
|
46811
|
+
):
|
46812
|
+
|
46813
|
+
app/controllers/pages_controller.rb:5:in `show'
|
46814
|
+
Started GET "/" for ::1 at 2017-12-14 11:34:46 +0100
|
46815
|
+
Processing by PagesController#show as HTML
|
46816
|
+
Completed 500 Internal Server Error in 628ms
|
46817
|
+
|
46818
|
+
|
46819
|
+
|
46820
|
+
ActionView::MissingTemplate (Missing template pages/show, application/show with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby]}. Searched in:
|
46821
|
+
* "/Users/jamieappleseed/Sites/baymard/plugins-and-scripts/anecdote/test/dummy/app/views"
|
46822
|
+
* "/Users/jamieappleseed/Sites/baymard/plugins-and-scripts/anecdote/app/views"
|
46823
|
+
):
|
46824
|
+
|
46825
|
+
app/controllers/pages_controller.rb:5:in `show'
|
46826
|
+
Started GET "/" for ::1 at 2017-12-14 11:35:03 +0100
|
46827
|
+
Processing by PagesController#show as HTML
|
46828
|
+
Completed 500 Internal Server Error in 622ms
|
46829
|
+
|
46830
|
+
|
46831
|
+
|
46832
|
+
ActionView::MissingTemplate (Missing template pages/show, application/show with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby]}. Searched in:
|
46833
|
+
* "/Users/jamieappleseed/Sites/baymard/plugins-and-scripts/anecdote/test/dummy/app/views"
|
46834
|
+
* "/Users/jamieappleseed/Sites/baymard/plugins-and-scripts/anecdote/app/views"
|
46835
|
+
):
|
46836
|
+
|
46837
|
+
app/controllers/pages_controller.rb:5:in `show'
|
46838
|
+
Started GET "/" for ::1 at 2017-12-14 11:35:12 +0100
|
46839
|
+
Processing by PagesController#show as HTML
|
46840
|
+
Completed 500 Internal Server Error in 733ms
|
46841
|
+
|
46842
|
+
|
46843
|
+
|
46844
|
+
ActionView::MissingTemplate (Missing template pages/show, application/show with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby]}. Searched in:
|
46845
|
+
* "/Users/jamieappleseed/Sites/baymard/plugins-and-scripts/anecdote/test/dummy/app/views"
|
46846
|
+
* "/Users/jamieappleseed/Sites/baymard/plugins-and-scripts/anecdote/app/views"
|
46847
|
+
):
|
46848
|
+
|
46849
|
+
app/controllers/pages_controller.rb:5:in `show'
|
46850
|
+
Started GET "/" for ::1 at 2017-12-14 11:35:27 +0100
|
46851
|
+
Processing by PagesController#show as HTML
|
46852
|
+
Completed 500 Internal Server Error in 601ms
|
46853
|
+
|
46854
|
+
|
46855
|
+
|
46856
|
+
RuntimeError (<h1 id="category-specific-sorting-a-new-way-to-sort-products">Category-Specific Sorting: A New Way to Sort Products</h1>
|
46857
|
+
|
46858
|
+
<div class="anecdote-graphic-dn32ja anecdote-module-3ba83n v-size-full-width"><div class="inner"><a href="//baymard.com" title="Clicking this image will take you to Baymard.com!" class="anecdote-intrinsic-embed-n42ha1"><div class="inner" style="padding-bottom: 64.92248062015504%;"><img alt="" src="/assets/category-specific-sorting-01-rei-mock-up-4b493aff69299ddd35d3cfe999080636a6a958570f7100fd4cc1d4b78a959ed8.jpg" /></div></a>
|
46859
|
+
<div class="anecdote-caption-ajkd3b"><div class="inner anecdote-wysicontent-ndj4ab"><p>This is the 3rd in a series of 9 articles based on research findings from our e-commerce <a href="http://baymard.com/research/ecommerce-product-lists study">product list usability</a>.</p>
|
46860
|
+
</div></div></div></div>
|
46861
|
+
|
46862
|
+
<p>We considered naming this article “the sort type all users want but zero sites offer” because category-specific sorting really is one of those rare instances where an obvious feature has somehow been <strong>completely overlooked</strong> by the e-commerce community.</p>
|
46863
|
+
|
46864
|
+
<div class="anecdote-graphic-dn32ja anecdote-module-3ba83n v-size-big v-mood-positive v-sidebar-caption"><div class="inner"><div class="anecdote-intrinsic-embed-n42ha1"><div class="inner" style="padding-bottom: 56.25%;"><iframe src="https://www.youtube.com/embed/ZCBE8ocOkAQ" frameborder="0" allowfullscreen=""></iframe></div></div>
|
46865
|
+
<div class="anecdote-caption-ajkd3b"><div class="inner anecdote-wysicontent-ndj4ab"><p>A mockup we’ve created of what category-specific sort types could look like at BestBuy. Here the three last sorting options – for TV screen size, refresh rate, and display depth – are available exclusively within the TV category while the other sort types are available site-wide.</p>
|
46866
|
+
</div></div></div></div>
|
46867
|
+
|
46868
|
+
<p>After all, it really shouldn’t come as a surprise that users would like to sort a list of TVs by “Screen size” or a collection of hard drives by “Storage capacity”.</p>
|
46869
|
+
|
46870
|
+
<div class="anecdote-pull-quote-sba2ha anecdote-module-3ba83n v-size-big"><div class="inner"><p>By “category-specific sort types” we mean any sorting options that are only available in one or a few select categories</p>
|
46871
|
+
</div></div>
|
46872
|
+
|
46873
|
+
<p>During our research study on product list usability the test subjects repeatedly sought out these kinds of category-specific sort types – however, to no avail since seemingly <strong>zero sites</strong> offer them. Even after <a href="http://baymard.com/ecommerce-product-lists/benchmark/site-reviews">benchmarking</a> the product lists of 50 major e-commerce sites we have yet to find a site that truly offer category-specific sorting.</p>
|
46874
|
+
|
46875
|
+
<div class="anecdote-gallery-dn2bak anecdote-module-3ba83n v-size-big"><div class="inner"><div class="content anecdote-flex-module-a4j2aj v-gutter-spacing-small v-flow-from-tablet">
|
46876
|
+
<div class="anecdote-graphic-dn32ja anecdote-module-3ba83n v-mood-positive" style="width:75.21865889212827%;flex-basis:75.21865889212827%"><div class="inner">
|
46877
|
+
<div class="anecdote-flex-offset-a4j2aj" style="padding-top: 0.0%;"></div>
|
46878
|
+
<div class="anecdote-intrinsic-embed-n42ha1"><div class="inner" style="padding-bottom: 66.66666666666666%;"><img alt="" src="/assets/category-specific-sorting-02-bestbuy-f14fff79d781e96075b7d85c778786cc0cf003610cd26e6128d3a8a00f045b8e.jpg" /></div></div>
|
46879
|
+
<div class="anecdote-caption-ajkd3b"><div class="inner anecdote-wysicontent-ndj4ab">
|
46880
|
+
<p>A mockup we’ve created of what category-specific sort types could look like at BestBuy. Here the three last sorting options – for TV screen size, refresh rate, and display depth – are available exclusively within the TV category while the other sort types are available site-wide.</p>
|
46881
|
+
</div></div>
|
46882
|
+
</div></div>
|
46883
|
+
<div class="anecdote-graphic-dn32ja anecdote-module-3ba83n v-mood-negative" style="width:24.78134110787172%;flex-basis:24.78134110787172%"><div class="inner">
|
46884
|
+
<div class="anecdote-flex-offset-a4j2aj" style="padding-top: 72.94117647058822%;"></div>
|
46885
|
+
<div class="anecdote-intrinsic-embed-n42ha1"><div class="inner" style="padding-bottom: 129.41176470588235%;"><img alt="" src="/assets/category-specific-sorting-08-faceted-sorting-952f653066737f1a75aaf01a867ba4ca4e072b2a76cd38d68d8c5515e9820baf.jpg" /></div></div>
|
46886
|
+
<div class="anecdote-caption-ajkd3b"><div class="inner anecdote-wysicontent-ndj4ab">
|
46887
|
+
<p>An example of how things can go really wrong.</p>
|
46888
|
+
</div></div>
|
46889
|
+
</div></div>
|
46890
|
+
</div></div></div>
|
46891
|
+
|
46892
|
+
<p>In this article we’ll outline our research findings on why <strong>category-specific sorting</strong> is so important to the user’s product finding abilities, and how it can be implemented.</p>
|
46893
|
+
|
46894
|
+
<div class="anecdote-graphic-dn32ja anecdote-module-3ba83n v-size-small v-float-left v-float-from-large-handheld"><div class="inner"><div class="anecdote-intrinsic-embed-n42ha1"><div class="inner" style="padding-bottom: 66.66666666666666%;"><img alt="" src="http://assets.baymard.com/blog/category-specific-sorting-02-bestbuy-d0496405ef767b1f469cc0e71cc4f84d.jpg" /></div></div>
|
46895
|
+
<div class="anecdote-caption-ajkd3b"><div class="inner anecdote-wysicontent-ndj4ab"><p>A mockup we’ve created of what category-specific sort types could look like at BestBuy. Here the three last sorting options – for TV screen size, refresh rate, and display depth – are available exclusively within the TV category while the other sort types are available site-wide.</p>
|
46896
|
+
</div></div></div></div>
|
46897
|
+
|
46898
|
+
<p>Given that category-specific sorting is such an uncommon features, let’s quickly <strong>define</strong> the term. By “category-specific sort types” we mean any sorting options that are only available in one or a few select categories (because they wouldn’t make sense as site-wide sorting options – they only make sense for the products within those particular categories). Examples include being able to sort suitcases by volume, fishing rods by length, pens by point size, hard drives by storage capacity and spindle speed, road bikes by weight, etc. It’s this category specificity that makes them different from common site-wide sort types such as ‘Best Selling’, ‘Relevance’, ‘User Ratings’, and ‘Price’, which are typically available for all products and categories throughout a site.</p>
|
46899
|
+
|
46900
|
+
<h2 id="soft-boundary-sorting-vs-hard-boundary-filtering">‘Soft’ Boundary Sorting vs ‘Hard’ Boundary Filtering</h2>
|
46901
|
+
|
46902
|
+
<p>The differences between filtering and sorting may on the surface appear subtle. Indeed, many users <strong>mix up</strong> the terminology or use the terms interchangeably. However, the differences are in fact quite significant: <em>Filters</em> set the criteria for whether a given product is in- or excluded from the product list (i.e. what is displayed) whereas <em>Sorting</em> determines the sequence of those products (i.e. how it is displayed).</p>
|
46903
|
+
|
46904
|
+
<p>This makes <em>Filters</em> great for setting “hard” boundaries while <em>Sorting</em> is optimal for applying “soft” boundaries:</p>
|
46905
|
+
|
46906
|
+
<ul>
|
46907
|
+
<li><strong>Filters</strong> – Sets a “hard” boundary. Any product that doesn’t strictly fall within the selected value(s) will be cut off. It is a great way for users to exclude any products that don’t match specific criteria.</li>
|
46908
|
+
<li><strong>Sorting</strong> – Applies a “soft” boundary. The products are ordered by the chosen sort type (in the case of category-specific sort types that typically means a product attribute). It changes the sequence of the products but doesn’t exclude any items, enabling users to still see items that fall outside their initial boundary.</li>
|
46909
|
+
</ul>
|
46910
|
+
|
46911
|
+
<p>Our <a href="http://baymard.com/research/ecommerce-product-lists">product list</a> usability testing showed that <strong>users need both</strong> hard boundaries (i.e. filters) and soft boundaries (i.e. sorting) for optimal control over the product list. Depending on the user’s knowledge of the product domain and their own needs and restrictions they may have very strict and 100% clear criteria the product must fall within, in which case “hard” boundary filters are appropriate.</p>
|
46912
|
+
|
46913
|
+
<p>However, in many cases users don’t have that strict criteria and sometimes they don’t even know what an appropriate filtering range would be, in which case “soft” boundary sorting is more suitable. For instance, the user might <strong>care about</strong> a product attribute without having a specific criteria for it, or they may not have the necessary domain knowledge to set meaningful cut-off points.</p>
|
46914
|
+
|
46915
|
+
<h2 id="case-the-2000-lightweight-road-bike">Case: The $2,000 Lightweight Road Bike</h2>
|
46916
|
+
|
46917
|
+
<p>Let’s take an example of a user with a simple purchase preference: <em>“I would like a lightweight road bike and my budget is $2,000.”</em> Now, that wouldn’t be an unusual or odd request in a road bike store, but it would be a <strong>very difficult</strong> product-finding task at the 98% of e-commerce sites that don’t offer category-specific sort types, because the “lightweight” preference isn’t suited for a “hard” boundary filter (but instead needs the soft boundary of a sort type).</p>
|
46918
|
+
|
46919
|
+
<div class="anecdote-graphic-dn32ja anecdote-module-3ba83n"><div class="inner"><div class="anecdote-intrinsic-embed-n42ha1"><div class="inner" style="padding-bottom: 64.92248062015504%;"><img alt="" src="/assets/category-specific-sorting-03-rei-original-5ec1970395515322e74260bc6227f3168c3bc233199bc26589043cc62bafca62.jpg" /></div></div>
|
46920
|
+
<div class="anecdote-caption-ajkd3b"><div class="inner anecdote-wysicontent-ndj4ab"><p>While there are plenty of sorting options available none of them are category-specific and none of them will help the user with their “lightweight” preference – even though the site clearly has weight information on their bikes (to support the “Weight (lbs)” filter).</p>
|
46921
|
+
</div></div></div></div>
|
46922
|
+
|
46923
|
+
<p>Let’s play out the scenario to illustrate the issue. Note in the following how you can replace “bike” with your main product category and “weight” with any one of the primary numeric product attributes for that product category (e.g., capacity, power, speed, size, duration):</p>
|
46924
|
+
|
46925
|
+
<ol>
|
46926
|
+
<li>The user starts out by finding the “Bikes” category and applies a “Bike type” filter of “Road bike”. The user now has a list of road bikes.</li>
|
46927
|
+
<li>Then, the user applies a “Price” filter defining an upper limit of $2,000. That’s easily done at most sites, and the specificity is well-suited for the hard boundary of a filter. The user now has a list of road bikes at $2,000 and below.</li>
|
46928
|
+
<li>Finally the user cares about the bike weight, and this is where problems arise. If a “Weight” filter at the lowest end of the range is applied, the user ends up with a very small selection of road bikes, and will still have to open all their respective product pages to figure out which one is the lightest. If a broader “Weight” range is applied (or no “Weight” filter is applied at all), the user ends up with road bikes that aren’t necessarily lightweight, forcing the user to open every product page and mentally keep track of which bikes are lightweight and which aren’t. Clearly neither of these approaches are ideal as the user must either apply overly restrictive filters (meaning they might miss out on relevant items), or make do with an excessively permissive “Weight” filter or no filtering at all (introducing a high degree of noise in the product list leading to needless friction in the user’s product exploration).</li>
|
46929
|
+
</ol>
|
46930
|
+
|
46931
|
+
<p>Now imagine in step #3, if the user had a <strong>category-specific sort type</strong> for “Weight”. If instead of applying “Weight” as a filter the user sorted the product list by weight (while keeping the $2,000 price filter in place), they would end up with a list of road bikes priced $2,000 or less sorted by lowest weight. The user would effectively have indicated their “lightweight” preference without having had to define highly precise cut-off points. Finally, the user would have a list of road bikes from lightest to heaviest costing $2,000 or below.</p>
|
46932
|
+
|
46933
|
+
<p>The “soft” boundaries of sorting essentially enable users to apply a preference to the product list without having to worry about striking some perfect <strong>magical sweet spot</strong> between an overly restrictive and excessively lax filter range. Yet filters remain relevant for things like the user’s specific budget limitation of $2,000 – this isn’t a mere preference. It’s by applying a combination of both “soft” (sorting) and “hard” (filtering) boundaries that the user is ultimately able to get what they are seeking: a list matching both the specific budget limitations of $2,000 while also having the “lightweight” preference applied.</p>
|
46934
|
+
|
46935
|
+
<h2 id="why-users-often-prefer-soft-boundaries">Why Users Often Prefer “Soft” Boundaries</h2>
|
46936
|
+
|
46937
|
+
<p>During usability testing the subjects often preferred the “soft” boundaries of sorting over the “hard” boundaries of filters. The road bike example illustrates why users in some cases prefer “soft” boundaries over “hard” ones – it alleviates them from defining cut-off points. Further investigation reveals <strong>3 reasons</strong> users prefer the “soft” boundaries of sorting:</p>
|
46938
|
+
|
46939
|
+
<ol>
|
46940
|
+
<li><strong>Fear of missing out</strong> – The user may not want to set a hard boundary in fear of missing out on relevant products that fall just outside their defined range, hence many users prefer the soft boundaries of sorting.</li>
|
46941
|
+
<li><strong>Lacks domain knowledge</strong> – The user may not know or feel like they have sufficient knowledge about the product domain (the natural spec jumps within the vertical, the implications of different product attributes, etc) to set appropriate cut-off criteria. In these instances the user will naturally find it more desirable to indicate their preference without having to define it through criteria they don’t fully understand.</li>
|
46942
|
+
<li><strong>Unclear about own preferences</strong> – The user may not be entirely clear on their own preferences and restrictions (budgetary limitations, compatibility requirements, usage conditions, etc). Oftentimes users purchasing for themselves are willing to flex their criteria significantly once they start seeing what’s available and begin to understand the product domain better.</li>
|
46943
|
+
</ol>
|
46944
|
+
|
46945
|
+
<div class="anecdote-graphic-dn32ja anecdote-module-3ba83n"><div class="inner"><div class="anecdote-intrinsic-embed-n42ha1"><div class="inner" style="padding-bottom: 48.740310077519375%;"><img alt="" src="/assets/category-specific-sorting-04-soft-boundary-preference-5cb14a2121d7f15c53bd1ab82551c3e293e624a5b63edc7924253cfa8212a149.png" /></div></div>
|
46946
|
+
<div class="anecdote-caption-ajkd3b"><div class="inner anecdote-wysicontent-ndj4ab"><p>Setting specific criteria requires knowledge about the product domain (reason #2) – the natural spec jumps within the vertical, the implications of different attribute values, etc. – as well as knowledge about your own preferences and restrictions (reason #3) – budgetary limitations, compatibility requirements, usage conditions, etc. Both of these feed into reason #1, the fear of missing out on relevant items. If the user either lacks domain knowledge or is unclear about their own preferences (or both), they will tend to prefer “soft” boundaries because they would fear excluding potentially relevant products if they were to apply restrictive filtering criteria.</p>
|
46947
|
+
</div></div></div></div>
|
46948
|
+
|
46949
|
+
<p>All of this is typically provoked by an <strong>information dilemma</strong>: the user has to set the “hard” boundary criteria before seeing the available products. So unless the user already has very good information about the product domain and their own preferences (prior to visiting the site) they often feel unconfident in applying such strict criteria. Few users want to fine-tune a product list if they don’t feel confident in accurately predicting the consequences of this fine-tuning.</p>
|
46950
|
+
|
46951
|
+
<h2 id="sorting-prevents-accidental-product-elimination">Sorting Prevents Accidental Product Elimination</h2>
|
46952
|
+
|
46953
|
+
<p>Sorting provide users a way to <strong>fine-tune</strong> the product list to their preferences without running the risk of accidentally eliminating relevant items. It thus helps solve one of the fundamental challenges users have when browsing an e-commerce site: somehow finding all the products that are relevant to their specific needs and preferences out of the site’s typically enormous product catalog.</p>
|
46954
|
+
|
46955
|
+
<p>In order to attain this highly curated list the user must narrow the product list down to a <strong>manageable size</strong> without discarding any relevant products in the process – they must at once be sufficiently aggressive in their filtering to reach a manageable product list without being so aggressive that they filter out relevant items in the process.</p>
|
46956
|
+
|
46957
|
+
<p>When the user can only filter and not sort by category-specific attributes they are limited to setting “hard” boundaries only. This leaves the user with two <strong>less-than-ideal options</strong>: either 1) apply the preferred range as filters and run the risk of accidental product elimination, or 2) loosen the preferred range to be more inclusive to avoid this elimination at the cost of ending up with a much poorer signal-to-noise ratio (due to numerous less relevant items suddenly being included).</p>
|
46958
|
+
|
46959
|
+
<p>Soft boundaries are very helpful in this regard because they allow the user to mainly browse a certain range without excluding (any potentially relevant) items outside it – enabling users to <strong>discriminate</strong> rather than eliminate.</p>
|
46960
|
+
|
46961
|
+
<h2 id="sorting-increase-domain-and-site-insight">Sorting Increase Domain and Site Insight</h2>
|
46962
|
+
|
46963
|
+
<p>“Soft boundary” sorting can provide users with a better understanding of the product vertical and site catalog by revealing different “spec jumps” and “product gaps”. For instance, in the road bike example, it might be that the first three bikes in the sorted list cost $1,800 and weigh in at ~17 pounds (~7.5kg), and then there’s a jump in the list where bikes four through ten are 6 to 8 pounds heavier but also cost significantly less (e.g., weigh 22 pounds but only cost $900). This would help the user better <strong>understand the relationship</strong> between price and weight within the road bikes domain.</p>
|
46964
|
+
|
46965
|
+
<div class="anecdote-graphic-dn32ja anecdote-module-3ba83n"><div class="inner"><div class="anecdote-intrinsic-embed-n42ha1"><div class="inner" style="padding-bottom: 64.92248062015504%;"><img alt="" src="/assets/category-specific-sorting-01-rei-mock-up-4b493aff69299ddd35d3cfe999080636a6a958570f7100fd4cc1d4b78a959ed8.jpg" /></div></div>
|
46966
|
+
<div class="anecdote-caption-ajkd3b"><div class="inner anecdote-wysicontent-ndj4ab"><p>A mock-up we’ve created of what the earlier road bike example could look like with category-specific sorting for “Weight” and “Gears”. Sort types like these can help both novice and expert users gain better insight into the site as well as the domain they are currently browsing.</p>
|
46967
|
+
</div></div></div></div>
|
46968
|
+
|
46969
|
+
<p>This is obviously very helpful to <strong>novice users</strong> because their lack of domain knowledge means they don’t instinctively know the natural “spec jumps” in the product vertical and might therefore inadvertently eliminate large clusters of perfectly relevant products. These users will therefore tend to prefer “soft” boundary sorting over “hard” boundary filters in fear of missing out due to a lack of domain knowledge, as explored earlier.</p>
|
46970
|
+
|
46971
|
+
<p>However, category-specific sorting can also help <strong>expert users</strong> despite them being intimately familiar with the “spec jumps” in a product vertical because it provides insight into the site’s catalog and any “product gaps” there might be in it. After all, just because the user knows a certain range of products exist they don’t necessarily know which of those products the site carries. By sorting instead of filtering, expert users get insight into which product groups the site carries within the vertical (and which they don’t carry).</p>
|
46972
|
+
|
46973
|
+
<p>Category-specific sort types can thus help increase novice users’ understanding of the product category (and any “spec jumps” within it) while simultaneously providing expert users insight into the breadth of the site’s product range (and any “gaps” within it).</p>
|
46974
|
+
|
46975
|
+
<h2 id="numerical-category-specific-product-attributes">Numerical Category-Specific Product Attributes</h2>
|
46976
|
+
|
46977
|
+
<p>Category-specific sort types are appropriate in product categories where the products <strong>share</strong> one or more numeric attributes that users may have an interest in or preference for – such as the “Display size” of TVs or “Storage capacity” of hard drives. This is particularly true if the attribute is something where users don’t want to apply strict criteria or are unfit at doing so due to a lack of domain knowledge.</p>
|
46978
|
+
|
46979
|
+
<p>The numericality of the product attribute is important because it makes it <strong>well-disposed to sorting</strong> as the products can be ordered based on the natural progression of the attribute. Compare this to a non-numeric product attribute like ‘Color’ which can’t really be sorted in a sequence logical to most users. It simply doesn’t make sense to sort by discrete product features even if it is technically possible because there isn’t a natural progression or hierarchy for such attributes. For example, DSLR camera lenses can’t meaningfully be sorted by “Lens type” or “Camera mount” (as they have no natural progression or hierarchy), but it could make sense to sort the category by “Focal length” or “Angle of View”.</p>
|
46980
|
+
|
46981
|
+
<div class="anecdote-graphic-dn32ja anecdote-module-3ba83n"><div class="inner"><div class="anecdote-intrinsic-embed-n42ha1"><div class="inner" style="padding-bottom: 62.967032967032964%;"><img alt="" src="/assets/category-specific-sorting-06-amazon-ad5690ce6efef0afa70989eb7fa5df86cc7b847c16f0f2d735f04088419c4068.jpg" /></div></div>
|
46982
|
+
<div class="anecdote-caption-ajkd3b"><div class="inner anecdote-wysicontent-ndj4ab"><p>The closest we came to a meaningful category-specific sort type during testing was at Amazon which have a special “Release date” sorting option within their “Movies & TV” scope. The attribute is unique to the category and dates obviously have a natural progression. Unfortunately it is a rather ambiguous product attribute since it isn’t clear if it is the premiere date of the movie or the day the DVD version was released – something that tripped up numerous subjects during the usability tests.</p>
|
46983
|
+
</div></div></div></div>
|
46984
|
+
|
46985
|
+
<p>Many product verticals do, however, have such numeric attributes and category-specific sort types are therefore relevant to a <strong>wide range</strong> of domains such as consumer electronics, kitchen utilities, office supplies, sports and hobby equipment, hardware, and similar industries. There are some exceptions of course – in particular verticals that are driven mainly by aesthetics, such as home decor and apparel. These verticals generally have only a few or no important numeric product attributes and it therefore won’t necessarily be meaningful to implement category-specific sort types in them (although even in these domains, attributes such as weight and size may be important depending on the exact product type).</p>
|
46986
|
+
|
46987
|
+
<h2 id="curating-the-category-specific-sort-types">Curating the Category-Specific Sort Types</h2>
|
46988
|
+
|
46989
|
+
<p>Determining which product attributes should be implemented as category-specific sort types is a fairly straight-forward matter: simply take the 3-5 most important numeric category-specific filters available in each category on your site and turn them into sorting options too. Let’s tackle some common questions that typically arise as a result of that statement:</p>
|
46990
|
+
|
46991
|
+
<ul>
|
46992
|
+
<li><em>Why 3-5 attributes?</em> To avoid overly long sorting drop-downs that induce choice paralysis. Although don’t get too stuck on the specific numbers, just make sure the number of sorting options don’t get completely out of hand.</li>
|
46993
|
+
<li><em>How do I identify which filters are the “most important”?</em> Well, these filters should already be identified as the order of the filtering options should be determined on their relative importance. This importance may be arrived at through expert (human) judgement or programmatically through various proxies (filter popularity, number of products, feature impact on price, etc) – or a combination of the two. An example of a very important product trait would of course be ‘<a href="http://baymard.com/blog/price-per-unit">price per unit</a>’ in categories where this attribute is relevant (i.e. where multi-quantity products are common, such as golf balls, copy paper, liquids, etc).</li>
|
46994
|
+
<li><em>Why numeric attributes?</em> Because they have a natural progression that makes them suitable for sorting. (See the above section.)</li>
|
46995
|
+
<li><em>Why category-specific filters?</em> The category-specific sort types should be provided in addition to the regular site-wide sort types such as “Price”. We assume you already have these in place and are here dealing with dynamically created sorting options that won’t be available site-wide. (Note: If category-specific filters aren’t already implemented, stop reading this article and implement them right now! Our usability testing revealed this to be one of the most fundamental features to the user’s browsing experience.)</li>
|
46996
|
+
<li><em>How do I turn the filters into sorting options as well?</em> Well, with category-specific filters already in place, this is a simple matter of reusing the data powering those filters. After all, in order to be filterable the product data will already be fully structured and can therefore simply be reused for sorting purposes as well.</li>
|
46997
|
+
</ul>
|
46998
|
+
|
46999
|
+
<p>So in summary: We limit the number of category-specific filters to double as sort types to <em>3-5 attributes</em> to avoid unruly and intimidating sorting drop-downs. Because of this restraint we obviously want to pick the <em>most important</em> product attributes to cater for the most likely use cases on our site. And we implement all of this by tapping into the data structures already in place for category-specific filters.</p>
|
47000
|
+
|
47001
|
+
<div class="anecdote-graphic-dn32ja anecdote-module-3ba83n"><div class="inner"><div class="anecdote-intrinsic-embed-n42ha1"><div class="inner" style="padding-bottom: 66.66666666666666%;"><img alt="" src="/assets/category-specific-sorting-02-bestbuy-f14fff79d781e96075b7d85c778786cc0cf003610cd26e6128d3a8a00f045b8e.jpg" /></div></div>
|
47002
|
+
<div class="anecdote-caption-ajkd3b"><div class="inner anecdote-wysicontent-ndj4ab"><p>If familiar with the <a href="http://baymard.com/blog/kano-model">Kano model</a>, the attributes to use as category-specific sort types will often be the “Performance” attributes within each product vertical.</p>
|
47003
|
+
</div></div></div></div>
|
47004
|
+
|
47005
|
+
<p>The beauty of category-specific sort types is that they tap into <strong>investments already made</strong> in filters, effectively increasing the return on those investments. Because it’s a technical feature, it doesn’t require continuous data collection or curation (beyond what is already being done for the filters), and it’s therefore a one-time investment that permanently increases the value of the continuous investments made in collecting, curating and maintaining structured product attributes.</p>
|
47006
|
+
|
47007
|
+
<p>The most important filters within each unique product category can thus <em>also</em> be utilized as sort types in that category. (It should of course still be a filter as well – this is about giving users the ability to apply both “hard” and “soft” boundaries to product attributes of interest to them.)</p>
|
47008
|
+
|
47009
|
+
<h2 id="empowering-users-with-category-specific-sort-types">Empowering Users with Category-Specific Sort Types</h2>
|
47010
|
+
|
47011
|
+
<p>The user needs both hard boundaries (i.e. filters) and soft boundaries (i.e. sorting) for optimal control over the product list. When the user has good domain knowledge and a clear understanding of their own needs, “hard boundary” filters are appropriate. However, as we’ve seen throughout this article there are other times where the user doesn’t have this level of domain knowledge or strict criteria for their product needs, in which case “soft boundary” sorting will often be more suitable. Both “hard” and “soft” boundaries thus have <strong>valid usage scenarios</strong> and this alone justifies their implementation.</p>
|
47012
|
+
|
47013
|
+
<p>A major bonus of implementing both “hard” and “soft” boundary controls (i.e. filtering and sorting) is that users can then <strong>combine them</strong>. This affords the user a new level of control over the product list, enabling them to wield both “hard” restrictions and “softer” preferences onto the site’s product lists. Suddenly a rather complex statement like “I would like a lightweight road bike and my budget is $2,000” can successfully be applied, with both “hard” restrictions (i.e. “road bike” and “$2,000 budget”) <em>and</em> “softer” preferences (i.e. “lightweight”).</p>
|
47014
|
+
|
47015
|
+
<p>If you have category-specific filters, the data is already there (and if you don’t, you really should implement them!), ready to be reused for category-specific <em>sort types</em> as well. Category-specific sort types are thus a great opportunity to gain even more from the structured data you’ve invested so dearly in collecting, curating and maintaining.</p>
|
47016
|
+
|
47017
|
+
<div class="anecdote-graphic-dn32ja anecdote-module-3ba83n v-size-small v-float-right v-float-from-large-handheld"><div class="inner"><div class="anecdote-intrinsic-embed-n42ha1"><div class="inner" style="padding-bottom: 129.41176470588235%;"><img alt="" src="/assets/category-specific-sorting-08-faceted-sorting-952f653066737f1a75aaf01a867ba4ca4e072b2a76cd38d68d8c5515e9820baf.jpg" /></div></div></div></div>
|
47018
|
+
|
47019
|
+
<p>Indeed, this may even be taken to the next level by combining category-specific sort types with scope selection in higher-level categories and on <a href="http://baymard.com/blog/ecommerce-sub-category-pages">sub-category pages</a>. This combines category-specific sort types with <a href="http://baymard.com/blog/faceted-sorting">faceted sorting</a>, allowing highly relevant and popular category-specific sort types to be displayed at (higher) category levels where all products don’t actually share the attribute to be sorted by. This would furthermore make category-specific sort types possible in search results despite some of the results not having the sorting attribute.</p>
|
47020
|
+
|
47021
|
+
<p>Sadly, category-specific sort types are a good example of just how <strong>neglected sorting</strong> is on e-commerce sites – numerous users want these sort types yet no sites offer them! It’s a rare example of an obvious innovation that e-commerce sites have yet to make. (Tip: you can see <a href="http://baymard.com/ecommerce-product-lists/benchmark/page-types/sorting-tool">46 different sorting interfaces</a> from the top US e-commerce sites we benchmarked for this study.)</p>
|
47022
|
+
|
47023
|
+
<p>Category-specific sort types are ultimately about <strong>empowering users</strong> with the tools they need to reach the product selection they want and have it presented in a way that suits their unique interests. It’s an obvious opportunity to increase the return on existing product data investments, empower your users and get ahead of the competition.</p>
|
47024
|
+
):
|
47025
|
+
|
47026
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47027
|
+
Started GET "/assets/category-specific-sorting-01-rei-mock-up-4b493aff69299ddd35d3cfe999080636a6a958570f7100fd4cc1d4b78a959ed8.jpg" for ::1 at 2017-12-14 11:35:30 +0100
|
47028
|
+
Started GET "/assets/category-specific-sorting-02-bestbuy-f14fff79d781e96075b7d85c778786cc0cf003610cd26e6128d3a8a00f045b8e.jpg" for ::1 at 2017-12-14 11:35:30 +0100
|
47029
|
+
Started GET "/assets/category-specific-sorting-03-rei-original-5ec1970395515322e74260bc6227f3168c3bc233199bc26589043cc62bafca62.jpg" for ::1 at 2017-12-14 11:35:30 +0100
|
47030
|
+
Started GET "/assets/category-specific-sorting-08-faceted-sorting-952f653066737f1a75aaf01a867ba4ca4e072b2a76cd38d68d8c5515e9820baf.jpg" for ::1 at 2017-12-14 11:35:30 +0100
|
47031
|
+
Started GET "/assets/category-specific-sorting-06-amazon-ad5690ce6efef0afa70989eb7fa5df86cc7b847c16f0f2d735f04088419c4068.jpg" for ::1 at 2017-12-14 11:35:30 +0100
|
47032
|
+
Started GET "/assets/category-specific-sorting-04-soft-boundary-preference-5cb14a2121d7f15c53bd1ab82551c3e293e624a5b63edc7924253cfa8212a149.png" for ::1 at 2017-12-14 11:35:30 +0100
|
47033
|
+
Started GET "/" for ::1 at 2017-12-14 11:35:35 +0100
|
47034
|
+
Processing by PagesController#show as HTML
|
47035
|
+
Completed 500 Internal Server Error in 623ms
|
47036
|
+
|
47037
|
+
|
47038
|
+
|
47039
|
+
RuntimeError ("<h1 id=\"category-specific-sorting-a-new-way-to-sort-products\">Category-Specific Sorting: A New Way to Sort Products</h1>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n v-size-full-width\"><div class=\"inner\"><a href=\"//baymard.com\" title=\"Clicking this image will take you to Baymard.com!\" class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 64.92248062015504%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-01-rei-mock-up-4b493aff69299ddd35d3cfe999080636a6a958570f7100fd4cc1d4b78a959ed8.jpg\" /></div></a>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>This is the 3rd in a series of 9 articles based on research findings from our e-commerce <a href=\"http://baymard.com/research/ecommerce-product-lists study\">product list usability</a>.</p>\n</div></div></div></div>\n\n<p>We considered naming this article “the sort type all users want but zero sites offer” because category-specific sorting really is one of those rare instances where an obvious feature has somehow been <strong>completely overlooked</strong> by the e-commerce community.</p>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n v-size-big v-mood-positive v-sidebar-caption\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 56.25%;\"><iframe src=\"https://www.youtube.com/embed/ZCBE8ocOkAQ\" frameborder=\"0\" allowfullscreen=\"\"></iframe></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>A mockup we’ve created of what category-specific sort types could look like at BestBuy. Here the three last sorting options – for TV screen size, refresh rate, and display depth – are available exclusively within the TV category while the other sort types are available site-wide.</p>\n</div></div></div></div>\n\n<p>After all, it really shouldn’t come as a surprise that users would like to sort a list of TVs by “Screen size” or a collection of hard drives by “Storage capacity”.</p>\n\n<div class=\"anecdote-pull-quote-sba2ha anecdote-module-3ba83n v-size-big\"><div class=\"inner\"><p>By “category-specific sort types” we mean any sorting options that are only available in one or a few select categories</p>\n</div></div>\n\n<p>During our research study on product list usability the test subjects repeatedly sought out these kinds of category-specific sort types – however, to no avail since seemingly <strong>zero sites</strong> offer them. Even after <a href=\"http://baymard.com/ecommerce-product-lists/benchmark/site-reviews\">benchmarking</a> the product lists of 50 major e-commerce sites we have yet to find a site that truly offer category-specific sorting.</p>\n\n<div class=\"anecdote-gallery-dn2bak anecdote-module-3ba83n v-size-big\"><div class=\"inner\"><div class=\"content anecdote-flex-module-a4j2aj v-gutter-spacing-small v-flow-from-tablet\">\n <div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n v-mood-positive\" style=\"width:75.21865889212827%;flex-basis:75.21865889212827%\"><div class=\"inner\">\n<div class=\"anecdote-flex-offset-a4j2aj\" style=\"padding-top: 0.0%;\"></div>\n<div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 66.66666666666666%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-02-bestbuy-f14fff79d781e96075b7d85c778786cc0cf003610cd26e6128d3a8a00f045b8e.jpg\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\">\n<p>A mockup we’ve created of what category-specific sort types could look like at BestBuy. Here the three last sorting options – for TV screen size, refresh rate, and display depth – are available exclusively within the TV category while the other sort types are available site-wide.</p>\n</div></div>\n</div></div>\n <div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n v-mood-negative\" style=\"width:24.78134110787172%;flex-basis:24.78134110787172%\"><div class=\"inner\">\n<div class=\"anecdote-flex-offset-a4j2aj\" style=\"padding-top: 72.94117647058822%;\"></div>\n<div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 129.41176470588235%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-08-faceted-sorting-952f653066737f1a75aaf01a867ba4ca4e072b2a76cd38d68d8c5515e9820baf.jpg\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\">\n<p>An example of how things can go really wrong.</p>\n</div></div>\n</div></div>\n</div></div></div>\n\n<p>In this article we’ll outline our research findings on why <strong>category-specific sorting</strong> is so important to the user’s product finding abilities, and how it can be implemented.</p>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n v-size-small v-float-left v-float-from-large-handheld\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 66.66666666666666%;\"><img alt=\"\" src=\"http://assets.baymard.com/blog/category-specific-sorting-02-bestbuy-d0496405ef767b1f469cc0e71cc4f84d.jpg\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>A mockup we’ve created of what category-specific sort types could look like at BestBuy. Here the three last sorting options – for TV screen size, refresh rate, and display depth – are available exclusively within the TV category while the other sort types are available site-wide.</p>\n</div></div></div></div>\n\n<p>Given that category-specific sorting is such an uncommon features, let’s quickly <strong>define</strong> the term. By “category-specific sort types” we mean any sorting options that are only available in one or a few select categories (because they wouldn’t make sense as site-wide sorting options – they only make sense for the products within those particular categories). Examples include being able to sort suitcases by volume, fishing rods by length, pens by point size, hard drives by storage capacity and spindle speed, road bikes by weight, etc. It’s this category specificity that makes them different from common site-wide sort types such as ‘Best Selling’, ‘Relevance’, ‘User Ratings’, and ‘Price’, which are typically available for all products and categories throughout a site.</p>\n\n<h2 id=\"soft-boundary-sorting-vs-hard-boundary-filtering\">‘Soft’ Boundary Sorting vs ‘Hard’ Boundary Filtering</h2>\n\n<p>The differences between filtering and sorting may on the surface appear subtle. Indeed, many users <strong>mix up</strong> the terminology or use the terms interchangeably. However, the differences are in fact quite significant: <em>Filters</em> set the criteria for whether a given product is in- or excluded from the product list (i.e. what is displayed) whereas <em>Sorting</em> determines the sequence of those products (i.e. how it is displayed).</p>\n\n<p>This makes <em>Filters</em> great for setting “hard” boundaries while <em>Sorting</em> is optimal for applying “soft” boundaries:</p>\n\n<ul>\n <li><strong>Filters</strong> – Sets a “hard” boundary. Any product that doesn’t strictly fall within the selected value(s) will be cut off. It is a great way for users to exclude any products that don’t match specific criteria.</li>\n <li><strong>Sorting</strong> – Applies a “soft” boundary. The products are ordered by the chosen sort type (in the case of category-specific sort types that typically means a product attribute). It changes the sequence of the products but doesn’t exclude any items, enabling users to still see items that fall outside their initial boundary.</li>\n</ul>\n\n<p>Our <a href=\"http://baymard.com/research/ecommerce-product-lists\">product list</a> usability testing showed that <strong>users need both</strong> hard boundaries (i.e. filters) and soft boundaries (i.e. sorting) for optimal control over the product list. Depending on the user’s knowledge of the product domain and their own needs and restrictions they may have very strict and 100% clear criteria the product must fall within, in which case “hard” boundary filters are appropriate.</p>\n\n<p>However, in many cases users don’t have that strict criteria and sometimes they don’t even know what an appropriate filtering range would be, in which case “soft” boundary sorting is more suitable. For instance, the user might <strong>care about</strong> a product attribute without having a specific criteria for it, or they may not have the necessary domain knowledge to set meaningful cut-off points.</p>\n\n<h2 id=\"case-the-2000-lightweight-road-bike\">Case: The $2,000 Lightweight Road Bike</h2>\n\n<p>Let’s take an example of a user with a simple purchase preference: <em>“I would like a lightweight road bike and my budget is $2,000.”</em> Now, that wouldn’t be an unusual or odd request in a road bike store, but it would be a <strong>very difficult</strong> product-finding task at the 98% of e-commerce sites that don’t offer category-specific sort types, because the “lightweight” preference isn’t suited for a “hard” boundary filter (but instead needs the soft boundary of a sort type).</p>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 64.92248062015504%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-03-rei-original-5ec1970395515322e74260bc6227f3168c3bc233199bc26589043cc62bafca62.jpg\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>While there are plenty of sorting options available none of them are category-specific and none of them will help the user with their “lightweight” preference – even though the site clearly has weight information on their bikes (to support the “Weight (lbs)” filter).</p>\n</div></div></div></div>\n\n<p>Let’s play out the scenario to illustrate the issue. Note in the following how you can replace “bike” with your main product category and “weight” with any one of the primary numeric product attributes for that product category (e.g., capacity, power, speed, size, duration):</p>\n\n<ol>\n <li>The user starts out by finding the “Bikes” category and applies a “Bike type” filter of “Road bike”. The user now has a list of road bikes.</li>\n <li>Then, the user applies a “Price” filter defining an upper limit of $2,000. That’s easily done at most sites, and the specificity is well-suited for the hard boundary of a filter. The user now has a list of road bikes at $2,000 and below.</li>\n <li>Finally the user cares about the bike weight, and this is where problems arise. If a “Weight” filter at the lowest end of the range is applied, the user ends up with a very small selection of road bikes, and will still have to open all their respective product pages to figure out which one is the lightest. If a broader “Weight” range is applied (or no “Weight” filter is applied at all), the user ends up with road bikes that aren’t necessarily lightweight, forcing the user to open every product page and mentally keep track of which bikes are lightweight and which aren’t. Clearly neither of these approaches are ideal as the user must either apply overly restrictive filters (meaning they might miss out on relevant items), or make do with an excessively permissive “Weight” filter or no filtering at all (introducing a high degree of noise in the product list leading to needless friction in the user’s product exploration).</li>\n</ol>\n\n<p>Now imagine in step #3, if the user had a <strong>category-specific sort type</strong> for “Weight”. If instead of applying “Weight” as a filter the user sorted the product list by weight (while keeping the $2,000 price filter in place), they would end up with a list of road bikes priced $2,000 or less sorted by lowest weight. The user would effectively have indicated their “lightweight” preference without having had to define highly precise cut-off points. Finally, the user would have a list of road bikes from lightest to heaviest costing $2,000 or below.</p>\n\n<p>The “soft” boundaries of sorting essentially enable users to apply a preference to the product list without having to worry about striking some perfect <strong>magical sweet spot</strong> between an overly restrictive and excessively lax filter range. Yet filters remain relevant for things like the user’s specific budget limitation of $2,000 – this isn’t a mere preference. It’s by applying a combination of both “soft” (sorting) and “hard” (filtering) boundaries that the user is ultimately able to get what they are seeking: a list matching both the specific budget limitations of $2,000 while also having the “lightweight” preference applied.</p>\n\n<h2 id=\"why-users-often-prefer-soft-boundaries\">Why Users Often Prefer “Soft” Boundaries</h2>\n\n<p>During usability testing the subjects often preferred the “soft” boundaries of sorting over the “hard” boundaries of filters. The road bike example illustrates why users in some cases prefer “soft” boundaries over “hard” ones – it alleviates them from defining cut-off points. Further investigation reveals <strong>3 reasons</strong> users prefer the “soft” boundaries of sorting:</p>\n\n<ol>\n <li><strong>Fear of missing out</strong> – The user may not want to set a hard boundary in fear of missing out on relevant products that fall just outside their defined range, hence many users prefer the soft boundaries of sorting.</li>\n <li><strong>Lacks domain knowledge</strong> – The user may not know or feel like they have sufficient knowledge about the product domain (the natural spec jumps within the vertical, the implications of different product attributes, etc) to set appropriate cut-off criteria. In these instances the user will naturally find it more desirable to indicate their preference without having to define it through criteria they don’t fully understand.</li>\n <li><strong>Unclear about own preferences</strong> – The user may not be entirely clear on their own preferences and restrictions (budgetary limitations, compatibility requirements, usage conditions, etc). Oftentimes users purchasing for themselves are willing to flex their criteria significantly once they start seeing what’s available and begin to understand the product domain better.</li>\n</ol>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 48.740310077519375%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-04-soft-boundary-preference-5cb14a2121d7f15c53bd1ab82551c3e293e624a5b63edc7924253cfa8212a149.png\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>Setting specific criteria requires knowledge about the product domain (reason #2) – the natural spec jumps within the vertical, the implications of different attribute values, etc. – as well as knowledge about your own preferences and restrictions (reason #3) – budgetary limitations, compatibility requirements, usage conditions, etc. Both of these feed into reason #1, the fear of missing out on relevant items. If the user either lacks domain knowledge or is unclear about their own preferences (or both), they will tend to prefer “soft” boundaries because they would fear excluding potentially relevant products if they were to apply restrictive filtering criteria.</p>\n</div></div></div></div>\n\n<p>All of this is typically provoked by an <strong>information dilemma</strong>: the user has to set the “hard” boundary criteria before seeing the available products. So unless the user already has very good information about the product domain and their own preferences (prior to visiting the site) they often feel unconfident in applying such strict criteria. Few users want to fine-tune a product list if they don’t feel confident in accurately predicting the consequences of this fine-tuning.</p>\n\n<h2 id=\"sorting-prevents-accidental-product-elimination\">Sorting Prevents Accidental Product Elimination</h2>\n\n<p>Sorting provide users a way to <strong>fine-tune</strong> the product list to their preferences without running the risk of accidentally eliminating relevant items. It thus helps solve one of the fundamental challenges users have when browsing an e-commerce site: somehow finding all the products that are relevant to their specific needs and preferences out of the site’s typically enormous product catalog.</p>\n\n<p>In order to attain this highly curated list the user must narrow the product list down to a <strong>manageable size</strong> without discarding any relevant products in the process – they must at once be sufficiently aggressive in their filtering to reach a manageable product list without being so aggressive that they filter out relevant items in the process.</p>\n\n<p>When the user can only filter and not sort by category-specific attributes they are limited to setting “hard” boundaries only. This leaves the user with two <strong>less-than-ideal options</strong>: either 1) apply the preferred range as filters and run the risk of accidental product elimination, or 2) loosen the preferred range to be more inclusive to avoid this elimination at the cost of ending up with a much poorer signal-to-noise ratio (due to numerous less relevant items suddenly being included).</p>\n\n<p>Soft boundaries are very helpful in this regard because they allow the user to mainly browse a certain range without excluding (any potentially relevant) items outside it – enabling users to <strong>discriminate</strong> rather than eliminate.</p>\n\n<h2 id=\"sorting-increase-domain-and-site-insight\">Sorting Increase Domain and Site Insight</h2>\n\n<p>“Soft boundary” sorting can provide users with a better understanding of the product vertical and site catalog by revealing different “spec jumps” and “product gaps”. For instance, in the road bike example, it might be that the first three bikes in the sorted list cost $1,800 and weigh in at ~17 pounds (~7.5kg), and then there’s a jump in the list where bikes four through ten are 6 to 8 pounds heavier but also cost significantly less (e.g., weigh 22 pounds but only cost $900). This would help the user better <strong>understand the relationship</strong> between price and weight within the road bikes domain.</p>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 64.92248062015504%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-01-rei-mock-up-4b493aff69299ddd35d3cfe999080636a6a958570f7100fd4cc1d4b78a959ed8.jpg\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>A mock-up we’ve created of what the earlier road bike example could look like with category-specific sorting for “Weight” and “Gears”. Sort types like these can help both novice and expert users gain better insight into the site as well as the domain they are currently browsing.</p>\n</div></div></div></div>\n\n<p>This is obviously very helpful to <strong>novice users</strong> because their lack of domain knowledge means they don’t instinctively know the natural “spec jumps” in the product vertical and might therefore inadvertently eliminate large clusters of perfectly relevant products. These users will therefore tend to prefer “soft” boundary sorting over “hard” boundary filters in fear of missing out due to a lack of domain knowledge, as explored earlier.</p>\n\n<p>However, category-specific sorting can also help <strong>expert users</strong> despite them being intimately familiar with the “spec jumps” in a product vertical because it provides insight into the site’s catalog and any “product gaps” there might be in it. After all, just because the user knows a certain range of products exist they don’t necessarily know which of those products the site carries. By sorting instead of filtering, expert users get insight into which product groups the site carries within the vertical (and which they don’t carry).</p>\n\n<p>Category-specific sort types can thus help increase novice users’ understanding of the product category (and any “spec jumps” within it) while simultaneously providing expert users insight into the breadth of the site’s product range (and any “gaps” within it).</p>\n\n<h2 id=\"numerical-category-specific-product-attributes\">Numerical Category-Specific Product Attributes</h2>\n\n<p>Category-specific sort types are appropriate in product categories where the products <strong>share</strong> one or more numeric attributes that users may have an interest in or preference for – such as the “Display size” of TVs or “Storage capacity” of hard drives. This is particularly true if the attribute is something where users don’t want to apply strict criteria or are unfit at doing so due to a lack of domain knowledge.</p>\n\n<p>The numericality of the product attribute is important because it makes it <strong>well-disposed to sorting</strong> as the products can be ordered based on the natural progression of the attribute. Compare this to a non-numeric product attribute like ‘Color’ which can’t really be sorted in a sequence logical to most users. It simply doesn’t make sense to sort by discrete product features even if it is technically possible because there isn’t a natural progression or hierarchy for such attributes. For example, DSLR camera lenses can’t meaningfully be sorted by “Lens type” or “Camera mount” (as they have no natural progression or hierarchy), but it could make sense to sort the category by “Focal length” or “Angle of View”.</p>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 62.967032967032964%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-06-amazon-ad5690ce6efef0afa70989eb7fa5df86cc7b847c16f0f2d735f04088419c4068.jpg\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>The closest we came to a meaningful category-specific sort type during testing was at Amazon which have a special “Release date” sorting option within their “Movies & TV” scope. The attribute is unique to the category and dates obviously have a natural progression. Unfortunately it is a rather ambiguous product attribute since it isn’t clear if it is the premiere date of the movie or the day the DVD version was released – something that tripped up numerous subjects during the usability tests.</p>\n</div></div></div></div>\n\n<p>Many product verticals do, however, have such numeric attributes and category-specific sort types are therefore relevant to a <strong>wide range</strong> of domains such as consumer electronics, kitchen utilities, office supplies, sports and hobby equipment, hardware, and similar industries. There are some exceptions of course – in particular verticals that are driven mainly by aesthetics, such as home decor and apparel. These verticals generally have only a few or no important numeric product attributes and it therefore won’t necessarily be meaningful to implement category-specific sort types in them (although even in these domains, attributes such as weight and size may be important depending on the exact product type).</p>\n\n<h2 id=\"curating-the-category-specific-sort-types\">Curating the Category-Specific Sort Types</h2>\n\n<p>Determining which product attributes should be implemented as category-specific sort types is a fairly straight-forward matter: simply take the 3-5 most important numeric category-specific filters available in each category on your site and turn them into sorting options too. Let’s tackle some common questions that typically arise as a result of that statement:</p>\n\n<ul>\n <li><em>Why 3-5 attributes?</em> To avoid overly long sorting drop-downs that induce choice paralysis. Although don’t get too stuck on the specific numbers, just make sure the number of sorting options don’t get completely out of hand.</li>\n <li><em>How do I identify which filters are the “most important”?</em> Well, these filters should already be identified as the order of the filtering options should be determined on their relative importance. This importance may be arrived at through expert (human) judgement or programmatically through various proxies (filter popularity, number of products, feature impact on price, etc) – or a combination of the two. An example of a very important product trait would of course be ‘<a href=\"http://baymard.com/blog/price-per-unit\">price per unit</a>’ in categories where this attribute is relevant (i.e. where multi-quantity products are common, such as golf balls, copy paper, liquids, etc).</li>\n <li><em>Why numeric attributes?</em> Because they have a natural progression that makes them suitable for sorting. (See the above section.)</li>\n <li><em>Why category-specific filters?</em> The category-specific sort types should be provided in addition to the regular site-wide sort types such as “Price”. We assume you already have these in place and are here dealing with dynamically created sorting options that won’t be available site-wide. (Note: If category-specific filters aren’t already implemented, stop reading this article and implement them right now! Our usability testing revealed this to be one of the most fundamental features to the user’s browsing experience.)</li>\n <li><em>How do I turn the filters into sorting options as well?</em> Well, with category-specific filters already in place, this is a simple matter of reusing the data powering those filters. After all, in order to be filterable the product data will already be fully structured and can therefore simply be reused for sorting purposes as well.</li>\n</ul>\n\n<p>So in summary: We limit the number of category-specific filters to double as sort types to <em>3-5 attributes</em> to avoid unruly and intimidating sorting drop-downs. Because of this restraint we obviously want to pick the <em>most important</em> product attributes to cater for the most likely use cases on our site. And we implement all of this by tapping into the data structures already in place for category-specific filters.</p>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 66.66666666666666%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-02-bestbuy-f14fff79d781e96075b7d85c778786cc0cf003610cd26e6128d3a8a00f045b8e.jpg\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>If familiar with the <a href=\"http://baymard.com/blog/kano-model\">Kano model</a>, the attributes to use as category-specific sort types will often be the “Performance” attributes within each product vertical.</p>\n</div></div></div></div>\n\n<p>The beauty of category-specific sort types is that they tap into <strong>investments already made</strong> in filters, effectively increasing the return on those investments. Because it’s a technical feature, it doesn’t require continuous data collection or curation (beyond what is already being done for the filters), and it’s therefore a one-time investment that permanently increases the value of the continuous investments made in collecting, curating and maintaining structured product attributes.</p>\n\n<p>The most important filters within each unique product category can thus <em>also</em> be utilized as sort types in that category. (It should of course still be a filter as well – this is about giving users the ability to apply both “hard” and “soft” boundaries to product attributes of interest to them.)</p>\n\n<h2 id=\"empowering-users-with-category-specific-sort-types\">Empowering Users with Category-Specific Sort Types</h2>\n\n<p>The user needs both hard boundaries (i.e. filters) and soft boundaries (i.e. sorting) for optimal control over the product list. When the user has good domain knowledge and a clear understanding of their own needs, “hard boundary” filters are appropriate. However, as we’ve seen throughout this article there are other times where the user doesn’t have this level of domain knowledge or strict criteria for their product needs, in which case “soft boundary” sorting will often be more suitable. Both “hard” and “soft” boundaries thus have <strong>valid usage scenarios</strong> and this alone justifies their implementation.</p>\n\n<p>A major bonus of implementing both “hard” and “soft” boundary controls (i.e. filtering and sorting) is that users can then <strong>combine them</strong>. This affords the user a new level of control over the product list, enabling them to wield both “hard” restrictions and “softer” preferences onto the site’s product lists. Suddenly a rather complex statement like “I would like a lightweight road bike and my budget is $2,000” can successfully be applied, with both “hard” restrictions (i.e. “road bike” and “$2,000 budget”) <em>and</em> “softer” preferences (i.e. “lightweight”).</p>\n\n<p>If you have category-specific filters, the data is already there (and if you don’t, you really should implement them!), ready to be reused for category-specific <em>sort types</em> as well. Category-specific sort types are thus a great opportunity to gain even more from the structured data you’ve invested so dearly in collecting, curating and maintaining.</p>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n v-size-small v-float-right v-float-from-large-handheld\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 129.41176470588235%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-08-faceted-sorting-952f653066737f1a75aaf01a867ba4ca4e072b2a76cd38d68d8c5515e9820baf.jpg\" /></div></div></div></div>\n\n<p>Indeed, this may even be taken to the next level by combining category-specific sort types with scope selection in higher-level categories and on <a href=\"http://baymard.com/blog/ecommerce-sub-category-pages\">sub-category pages</a>. This combines category-specific sort types with <a href=\"http://baymard.com/blog/faceted-sorting\">faceted sorting</a>, allowing highly relevant and popular category-specific sort types to be displayed at (higher) category levels where all products don’t actually share the attribute to be sorted by. This would furthermore make category-specific sort types possible in search results despite some of the results not having the sorting attribute.</p>\n\n<p>Sadly, category-specific sort types are a good example of just how <strong>neglected sorting</strong> is on e-commerce sites – numerous users want these sort types yet no sites offer them! It’s a rare example of an obvious innovation that e-commerce sites have yet to make. (Tip: you can see <a href=\"http://baymard.com/ecommerce-product-lists/benchmark/page-types/sorting-tool\">46 different sorting interfaces</a> from the top US e-commerce sites we benchmarked for this study.)</p>\n\n<p>Category-specific sort types are ultimately about <strong>empowering users</strong> with the tools they need to reach the product selection they want and have it presented in a way that suits their unique interests. It’s an obvious opportunity to increase the return on existing product data investments, empower your users and get ahead of the competition.</p>\n"):
|
47040
|
+
|
47041
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47042
|
+
Started GET "/" for ::1 at 2017-12-14 11:36:06 +0100
|
47043
|
+
Processing by PagesController#show as HTML
|
47044
|
+
Completed 500 Internal Server Error in 590ms
|
47045
|
+
|
47046
|
+
|
47047
|
+
|
47048
|
+
RuntimeError ("<h1 id=\"category-specific-sorting-a-new-way-to-sort-products\">Category-Specific Sorting: A New Way to Sort Products</h1>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n v-size-full-width\"><div class=\"inner\"><a href=\"//baymard.com\" title=\"Clicking this image will take you to Baymard.com!\" class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 64.92248062015504%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-01-rei-mock-up-4b493aff69299ddd35d3cfe999080636a6a958570f7100fd4cc1d4b78a959ed8.jpg\" /></div></a>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>This is the 3rd in a series of 9 articles based on research findings from our e-commerce <a href=\"http://baymard.com/research/ecommerce-product-lists study\">product list usability</a>.</p>\n</div></div></div></div>\n\n<p>We considered naming this article “the sort type all users want but zero sites offer” because category-specific sorting really is one of those rare instances where an obvious feature has somehow been <strong>completely overlooked</strong> by the e-commerce community.</p>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n v-size-big v-mood-positive v-sidebar-caption\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 56.25%;\"><iframe src=\"https://www.youtube.com/embed/ZCBE8ocOkAQ\" frameborder=\"0\" allowfullscreen=\"\"></iframe></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>A mockup we’ve created of what category-specific sort types could look like at BestBuy. Here the three last sorting options – for TV screen size, refresh rate, and display depth – are available exclusively within the TV category while the other sort types are available site-wide.</p>\n</div></div></div></div>\n\n<p>After all, it really shouldn’t come as a surprise that users would like to sort a list of TVs by “Screen size” or a collection of hard drives by “Storage capacity”.</p>\n\n<div class=\"anecdote-pull-quote-sba2ha anecdote-module-3ba83n v-size-big\"><div class=\"inner\"><p>By “category-specific sort types” we mean any sorting options that are only available in one or a few select categories</p>\n</div></div>\n\n<p>During our research study on product list usability the test subjects repeatedly sought out these kinds of category-specific sort types – however, to no avail since seemingly <strong>zero sites</strong> offer them. Even after <a href=\"http://baymard.com/ecommerce-product-lists/benchmark/site-reviews\">benchmarking</a> the product lists of 50 major e-commerce sites we have yet to find a site that truly offer category-specific sorting.</p>\n\n<div class=\"anecdote-gallery-dn2bak anecdote-module-3ba83n v-size-big\"><div class=\"inner\"><div class=\"content anecdote-flex-module-a4j2aj v-gutter-spacing-small v-flow-from-tablet\">\n <div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n v-mood-positive\" style=\"width:75.21865889212827%;flex-basis:75.21865889212827%\"><div class=\"inner\">\n<div class=\"anecdote-flex-offset-a4j2aj\" style=\"padding-top: 0.0%;\"></div>\n<div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 66.66666666666666%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-02-bestbuy-f14fff79d781e96075b7d85c778786cc0cf003610cd26e6128d3a8a00f045b8e.jpg\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\">\n<p>A mockup we’ve created of what category-specific sort types could look like at BestBuy. Here the three last sorting options – for TV screen size, refresh rate, and display depth – are available exclusively within the TV category while the other sort types are available site-wide.</p>\n</div></div>\n</div></div>\n <div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n v-mood-negative\" style=\"width:24.78134110787172%;flex-basis:24.78134110787172%\"><div class=\"inner\">\n<div class=\"anecdote-flex-offset-a4j2aj\" style=\"padding-top: 72.94117647058822%;\"></div>\n<div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 129.41176470588235%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-08-faceted-sorting-952f653066737f1a75aaf01a867ba4ca4e072b2a76cd38d68d8c5515e9820baf.jpg\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\">\n<p>An example of how things can go really wrong.</p>\n</div></div>\n</div></div>\n</div></div></div>\n\n<p>In this article we’ll outline our research findings on why <strong>category-specific sorting</strong> is so important to the user’s product finding abilities, and how it can be implemented.</p>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n v-size-small v-float-left v-float-from-large-handheld\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 66.66666666666666%;\"><img alt=\"\" src=\"http://assets.baymard.com/blog/category-specific-sorting-02-bestbuy-d0496405ef767b1f469cc0e71cc4f84d.jpg\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>A mockup we’ve created of what category-specific sort types could look like at BestBuy. Here the three last sorting options – for TV screen size, refresh rate, and display depth – are available exclusively within the TV category while the other sort types are available site-wide.</p>\n</div></div></div></div>\n\n<p>Given that category-specific sorting is such an uncommon features, let’s quickly <strong>define</strong> the term. By “category-specific sort types” we mean any sorting options that are only available in one or a few select categories (because they wouldn’t make sense as site-wide sorting options – they only make sense for the products within those particular categories). Examples include being able to sort suitcases by volume, fishing rods by length, pens by point size, hard drives by storage capacity and spindle speed, road bikes by weight, etc. It’s this category specificity that makes them different from common site-wide sort types such as ‘Best Selling’, ‘Relevance’, ‘User Ratings’, and ‘Price’, which are typically available for all products and categories throughout a site.</p>\n\n<h2 id=\"soft-boundary-sorting-vs-hard-boundary-filtering\">‘Soft’ Boundary Sorting vs ‘Hard’ Boundary Filtering</h2>\n\n<p>The differences between filtering and sorting may on the surface appear subtle. Indeed, many users <strong>mix up</strong> the terminology or use the terms interchangeably. However, the differences are in fact quite significant: <em>Filters</em> set the criteria for whether a given product is in- or excluded from the product list (i.e. what is displayed) whereas <em>Sorting</em> determines the sequence of those products (i.e. how it is displayed).</p>\n\n<p>This makes <em>Filters</em> great for setting “hard” boundaries while <em>Sorting</em> is optimal for applying “soft” boundaries:</p>\n\n<ul>\n <li><strong>Filters</strong> – Sets a “hard” boundary. Any product that doesn’t strictly fall within the selected value(s) will be cut off. It is a great way for users to exclude any products that don’t match specific criteria.</li>\n <li><strong>Sorting</strong> – Applies a “soft” boundary. The products are ordered by the chosen sort type (in the case of category-specific sort types that typically means a product attribute). It changes the sequence of the products but doesn’t exclude any items, enabling users to still see items that fall outside their initial boundary.</li>\n</ul>\n\n<p>Our <a href=\"http://baymard.com/research/ecommerce-product-lists\">product list</a> usability testing showed that <strong>users need both</strong> hard boundaries (i.e. filters) and soft boundaries (i.e. sorting) for optimal control over the product list. Depending on the user’s knowledge of the product domain and their own needs and restrictions they may have very strict and 100% clear criteria the product must fall within, in which case “hard” boundary filters are appropriate.</p>\n\n<p>However, in many cases users don’t have that strict criteria and sometimes they don’t even know what an appropriate filtering range would be, in which case “soft” boundary sorting is more suitable. For instance, the user might <strong>care about</strong> a product attribute without having a specific criteria for it, or they may not have the necessary domain knowledge to set meaningful cut-off points.</p>\n\n<h2 id=\"case-the-2000-lightweight-road-bike\">Case: The $2,000 Lightweight Road Bike</h2>\n\n<p>Let’s take an example of a user with a simple purchase preference: <em>“I would like a lightweight road bike and my budget is $2,000.”</em> Now, that wouldn’t be an unusual or odd request in a road bike store, but it would be a <strong>very difficult</strong> product-finding task at the 98% of e-commerce sites that don’t offer category-specific sort types, because the “lightweight” preference isn’t suited for a “hard” boundary filter (but instead needs the soft boundary of a sort type).</p>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 64.92248062015504%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-03-rei-original-5ec1970395515322e74260bc6227f3168c3bc233199bc26589043cc62bafca62.jpg\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>While there are plenty of sorting options available none of them are category-specific and none of them will help the user with their “lightweight” preference – even though the site clearly has weight information on their bikes (to support the “Weight (lbs)” filter).</p>\n</div></div></div></div>\n\n<p>Let’s play out the scenario to illustrate the issue. Note in the following how you can replace “bike” with your main product category and “weight” with any one of the primary numeric product attributes for that product category (e.g., capacity, power, speed, size, duration):</p>\n\n<ol>\n <li>The user starts out by finding the “Bikes” category and applies a “Bike type” filter of “Road bike”. The user now has a list of road bikes.</li>\n <li>Then, the user applies a “Price” filter defining an upper limit of $2,000. That’s easily done at most sites, and the specificity is well-suited for the hard boundary of a filter. The user now has a list of road bikes at $2,000 and below.</li>\n <li>Finally the user cares about the bike weight, and this is where problems arise. If a “Weight” filter at the lowest end of the range is applied, the user ends up with a very small selection of road bikes, and will still have to open all their respective product pages to figure out which one is the lightest. If a broader “Weight” range is applied (or no “Weight” filter is applied at all), the user ends up with road bikes that aren’t necessarily lightweight, forcing the user to open every product page and mentally keep track of which bikes are lightweight and which aren’t. Clearly neither of these approaches are ideal as the user must either apply overly restrictive filters (meaning they might miss out on relevant items), or make do with an excessively permissive “Weight” filter or no filtering at all (introducing a high degree of noise in the product list leading to needless friction in the user’s product exploration).</li>\n</ol>\n\n<p>Now imagine in step #3, if the user had a <strong>category-specific sort type</strong> for “Weight”. If instead of applying “Weight” as a filter the user sorted the product list by weight (while keeping the $2,000 price filter in place), they would end up with a list of road bikes priced $2,000 or less sorted by lowest weight. The user would effectively have indicated their “lightweight” preference without having had to define highly precise cut-off points. Finally, the user would have a list of road bikes from lightest to heaviest costing $2,000 or below.</p>\n\n<p>The “soft” boundaries of sorting essentially enable users to apply a preference to the product list without having to worry about striking some perfect <strong>magical sweet spot</strong> between an overly restrictive and excessively lax filter range. Yet filters remain relevant for things like the user’s specific budget limitation of $2,000 – this isn’t a mere preference. It’s by applying a combination of both “soft” (sorting) and “hard” (filtering) boundaries that the user is ultimately able to get what they are seeking: a list matching both the specific budget limitations of $2,000 while also having the “lightweight” preference applied.</p>\n\n<h2 id=\"why-users-often-prefer-soft-boundaries\">Why Users Often Prefer “Soft” Boundaries</h2>\n\n<p>During usability testing the subjects often preferred the “soft” boundaries of sorting over the “hard” boundaries of filters. The road bike example illustrates why users in some cases prefer “soft” boundaries over “hard” ones – it alleviates them from defining cut-off points. Further investigation reveals <strong>3 reasons</strong> users prefer the “soft” boundaries of sorting:</p>\n\n<ol>\n <li><strong>Fear of missing out</strong> – The user may not want to set a hard boundary in fear of missing out on relevant products that fall just outside their defined range, hence many users prefer the soft boundaries of sorting.</li>\n <li><strong>Lacks domain knowledge</strong> – The user may not know or feel like they have sufficient knowledge about the product domain (the natural spec jumps within the vertical, the implications of different product attributes, etc) to set appropriate cut-off criteria. In these instances the user will naturally find it more desirable to indicate their preference without having to define it through criteria they don’t fully understand.</li>\n <li><strong>Unclear about own preferences</strong> – The user may not be entirely clear on their own preferences and restrictions (budgetary limitations, compatibility requirements, usage conditions, etc). Oftentimes users purchasing for themselves are willing to flex their criteria significantly once they start seeing what’s available and begin to understand the product domain better.</li>\n</ol>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 48.740310077519375%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-04-soft-boundary-preference-5cb14a2121d7f15c53bd1ab82551c3e293e624a5b63edc7924253cfa8212a149.png\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>Setting specific criteria requires knowledge about the product domain (reason #2) – the natural spec jumps within the vertical, the implications of different attribute values, etc. – as well as knowledge about your own preferences and restrictions (reason #3) – budgetary limitations, compatibility requirements, usage conditions, etc. Both of these feed into reason #1, the fear of missing out on relevant items. If the user either lacks domain knowledge or is unclear about their own preferences (or both), they will tend to prefer “soft” boundaries because they would fear excluding potentially relevant products if they were to apply restrictive filtering criteria.</p>\n</div></div></div></div>\n\n<p>All of this is typically provoked by an <strong>information dilemma</strong>: the user has to set the “hard” boundary criteria before seeing the available products. So unless the user already has very good information about the product domain and their own preferences (prior to visiting the site) they often feel unconfident in applying such strict criteria. Few users want to fine-tune a product list if they don’t feel confident in accurately predicting the consequences of this fine-tuning.</p>\n\n<h2 id=\"sorting-prevents-accidental-product-elimination\">Sorting Prevents Accidental Product Elimination</h2>\n\n<p>Sorting provide users a way to <strong>fine-tune</strong> the product list to their preferences without running the risk of accidentally eliminating relevant items. It thus helps solve one of the fundamental challenges users have when browsing an e-commerce site: somehow finding all the products that are relevant to their specific needs and preferences out of the site’s typically enormous product catalog.</p>\n\n<p>In order to attain this highly curated list the user must narrow the product list down to a <strong>manageable size</strong> without discarding any relevant products in the process – they must at once be sufficiently aggressive in their filtering to reach a manageable product list without being so aggressive that they filter out relevant items in the process.</p>\n\n<p>When the user can only filter and not sort by category-specific attributes they are limited to setting “hard” boundaries only. This leaves the user with two <strong>less-than-ideal options</strong>: either 1) apply the preferred range as filters and run the risk of accidental product elimination, or 2) loosen the preferred range to be more inclusive to avoid this elimination at the cost of ending up with a much poorer signal-to-noise ratio (due to numerous less relevant items suddenly being included).</p>\n\n<p>Soft boundaries are very helpful in this regard because they allow the user to mainly browse a certain range without excluding (any potentially relevant) items outside it – enabling users to <strong>discriminate</strong> rather than eliminate.</p>\n\n<h2 id=\"sorting-increase-domain-and-site-insight\">Sorting Increase Domain and Site Insight</h2>\n\n<p>“Soft boundary” sorting can provide users with a better understanding of the product vertical and site catalog by revealing different “spec jumps” and “product gaps”. For instance, in the road bike example, it might be that the first three bikes in the sorted list cost $1,800 and weigh in at ~17 pounds (~7.5kg), and then there’s a jump in the list where bikes four through ten are 6 to 8 pounds heavier but also cost significantly less (e.g., weigh 22 pounds but only cost $900). This would help the user better <strong>understand the relationship</strong> between price and weight within the road bikes domain.</p>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 64.92248062015504%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-01-rei-mock-up-4b493aff69299ddd35d3cfe999080636a6a958570f7100fd4cc1d4b78a959ed8.jpg\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>A mock-up we’ve created of what the earlier road bike example could look like with category-specific sorting for “Weight” and “Gears”. Sort types like these can help both novice and expert users gain better insight into the site as well as the domain they are currently browsing.</p>\n</div></div></div></div>\n\n<p>This is obviously very helpful to <strong>novice users</strong> because their lack of domain knowledge means they don’t instinctively know the natural “spec jumps” in the product vertical and might therefore inadvertently eliminate large clusters of perfectly relevant products. These users will therefore tend to prefer “soft” boundary sorting over “hard” boundary filters in fear of missing out due to a lack of domain knowledge, as explored earlier.</p>\n\n<p>However, category-specific sorting can also help <strong>expert users</strong> despite them being intimately familiar with the “spec jumps” in a product vertical because it provides insight into the site’s catalog and any “product gaps” there might be in it. After all, just because the user knows a certain range of products exist they don’t necessarily know which of those products the site carries. By sorting instead of filtering, expert users get insight into which product groups the site carries within the vertical (and which they don’t carry).</p>\n\n<p>Category-specific sort types can thus help increase novice users’ understanding of the product category (and any “spec jumps” within it) while simultaneously providing expert users insight into the breadth of the site’s product range (and any “gaps” within it).</p>\n\n<h2 id=\"numerical-category-specific-product-attributes\">Numerical Category-Specific Product Attributes</h2>\n\n<p>Category-specific sort types are appropriate in product categories where the products <strong>share</strong> one or more numeric attributes that users may have an interest in or preference for – such as the “Display size” of TVs or “Storage capacity” of hard drives. This is particularly true if the attribute is something where users don’t want to apply strict criteria or are unfit at doing so due to a lack of domain knowledge.</p>\n\n<p>The numericality of the product attribute is important because it makes it <strong>well-disposed to sorting</strong> as the products can be ordered based on the natural progression of the attribute. Compare this to a non-numeric product attribute like ‘Color’ which can’t really be sorted in a sequence logical to most users. It simply doesn’t make sense to sort by discrete product features even if it is technically possible because there isn’t a natural progression or hierarchy for such attributes. For example, DSLR camera lenses can’t meaningfully be sorted by “Lens type” or “Camera mount” (as they have no natural progression or hierarchy), but it could make sense to sort the category by “Focal length” or “Angle of View”.</p>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 62.967032967032964%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-06-amazon-ad5690ce6efef0afa70989eb7fa5df86cc7b847c16f0f2d735f04088419c4068.jpg\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>The closest we came to a meaningful category-specific sort type during testing was at Amazon which have a special “Release date” sorting option within their “Movies & TV” scope. The attribute is unique to the category and dates obviously have a natural progression. Unfortunately it is a rather ambiguous product attribute since it isn’t clear if it is the premiere date of the movie or the day the DVD version was released – something that tripped up numerous subjects during the usability tests.</p>\n</div></div></div></div>\n\n<p>Many product verticals do, however, have such numeric attributes and category-specific sort types are therefore relevant to a <strong>wide range</strong> of domains such as consumer electronics, kitchen utilities, office supplies, sports and hobby equipment, hardware, and similar industries. There are some exceptions of course – in particular verticals that are driven mainly by aesthetics, such as home decor and apparel. These verticals generally have only a few or no important numeric product attributes and it therefore won’t necessarily be meaningful to implement category-specific sort types in them (although even in these domains, attributes such as weight and size may be important depending on the exact product type).</p>\n\n<h2 id=\"curating-the-category-specific-sort-types\">Curating the Category-Specific Sort Types</h2>\n\n<p>Determining which product attributes should be implemented as category-specific sort types is a fairly straight-forward matter: simply take the 3-5 most important numeric category-specific filters available in each category on your site and turn them into sorting options too. Let’s tackle some common questions that typically arise as a result of that statement:</p>\n\n<ul>\n <li><em>Why 3-5 attributes?</em> To avoid overly long sorting drop-downs that induce choice paralysis. Although don’t get too stuck on the specific numbers, just make sure the number of sorting options don’t get completely out of hand.</li>\n <li><em>How do I identify which filters are the “most important”?</em> Well, these filters should already be identified as the order of the filtering options should be determined on their relative importance. This importance may be arrived at through expert (human) judgement or programmatically through various proxies (filter popularity, number of products, feature impact on price, etc) – or a combination of the two. An example of a very important product trait would of course be ‘<a href=\"http://baymard.com/blog/price-per-unit\">price per unit</a>’ in categories where this attribute is relevant (i.e. where multi-quantity products are common, such as golf balls, copy paper, liquids, etc).</li>\n <li><em>Why numeric attributes?</em> Because they have a natural progression that makes them suitable for sorting. (See the above section.)</li>\n <li><em>Why category-specific filters?</em> The category-specific sort types should be provided in addition to the regular site-wide sort types such as “Price”. We assume you already have these in place and are here dealing with dynamically created sorting options that won’t be available site-wide. (Note: If category-specific filters aren’t already implemented, stop reading this article and implement them right now! Our usability testing revealed this to be one of the most fundamental features to the user’s browsing experience.)</li>\n <li><em>How do I turn the filters into sorting options as well?</em> Well, with category-specific filters already in place, this is a simple matter of reusing the data powering those filters. After all, in order to be filterable the product data will already be fully structured and can therefore simply be reused for sorting purposes as well.</li>\n</ul>\n\n<p>So in summary: We limit the number of category-specific filters to double as sort types to <em>3-5 attributes</em> to avoid unruly and intimidating sorting drop-downs. Because of this restraint we obviously want to pick the <em>most important</em> product attributes to cater for the most likely use cases on our site. And we implement all of this by tapping into the data structures already in place for category-specific filters.</p>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 66.66666666666666%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-02-bestbuy-f14fff79d781e96075b7d85c778786cc0cf003610cd26e6128d3a8a00f045b8e.jpg\" /></div></div>\n<div class=\"anecdote-caption-ajkd3b\"><div class=\"inner anecdote-wysicontent-ndj4ab\"><p>If familiar with the <a href=\"http://baymard.com/blog/kano-model\">Kano model</a>, the attributes to use as category-specific sort types will often be the “Performance” attributes within each product vertical.</p>\n</div></div></div></div>\n\n<p>The beauty of category-specific sort types is that they tap into <strong>investments already made</strong> in filters, effectively increasing the return on those investments. Because it’s a technical feature, it doesn’t require continuous data collection or curation (beyond what is already being done for the filters), and it’s therefore a one-time investment that permanently increases the value of the continuous investments made in collecting, curating and maintaining structured product attributes.</p>\n\n<p>The most important filters within each unique product category can thus <em>also</em> be utilized as sort types in that category. (It should of course still be a filter as well – this is about giving users the ability to apply both “hard” and “soft” boundaries to product attributes of interest to them.)</p>\n\n<h2 id=\"empowering-users-with-category-specific-sort-types\">Empowering Users with Category-Specific Sort Types</h2>\n\n<p>The user needs both hard boundaries (i.e. filters) and soft boundaries (i.e. sorting) for optimal control over the product list. When the user has good domain knowledge and a clear understanding of their own needs, “hard boundary” filters are appropriate. However, as we’ve seen throughout this article there are other times where the user doesn’t have this level of domain knowledge or strict criteria for their product needs, in which case “soft boundary” sorting will often be more suitable. Both “hard” and “soft” boundaries thus have <strong>valid usage scenarios</strong> and this alone justifies their implementation.</p>\n\n<p>A major bonus of implementing both “hard” and “soft” boundary controls (i.e. filtering and sorting) is that users can then <strong>combine them</strong>. This affords the user a new level of control over the product list, enabling them to wield both “hard” restrictions and “softer” preferences onto the site’s product lists. Suddenly a rather complex statement like “I would like a lightweight road bike and my budget is $2,000” can successfully be applied, with both “hard” restrictions (i.e. “road bike” and “$2,000 budget”) <em>and</em> “softer” preferences (i.e. “lightweight”).</p>\n\n<p>If you have category-specific filters, the data is already there (and if you don’t, you really should implement them!), ready to be reused for category-specific <em>sort types</em> as well. Category-specific sort types are thus a great opportunity to gain even more from the structured data you’ve invested so dearly in collecting, curating and maintaining.</p>\n\n<div class=\"anecdote-graphic-dn32ja anecdote-module-3ba83n v-size-small v-float-right v-float-from-large-handheld\"><div class=\"inner\"><div class=\"anecdote-intrinsic-embed-n42ha1\"><div class=\"inner\" style=\"padding-bottom: 129.41176470588235%;\"><img alt=\"\" src=\"/assets/category-specific-sorting-08-faceted-sorting-952f653066737f1a75aaf01a867ba4ca4e072b2a76cd38d68d8c5515e9820baf.jpg\" /></div></div></div></div>\n\n<p>Indeed, this may even be taken to the next level by combining category-specific sort types with scope selection in higher-level categories and on <a href=\"http://baymard.com/blog/ecommerce-sub-category-pages\">sub-category pages</a>. This combines category-specific sort types with <a href=\"http://baymard.com/blog/faceted-sorting\">faceted sorting</a>, allowing highly relevant and popular category-specific sort types to be displayed at (higher) category levels where all products don’t actually share the attribute to be sorted by. This would furthermore make category-specific sort types possible in search results despite some of the results not having the sorting attribute.</p>\n\n<p>Sadly, category-specific sort types are a good example of just how <strong>neglected sorting</strong> is on e-commerce sites – numerous users want these sort types yet no sites offer them! It’s a rare example of an obvious innovation that e-commerce sites have yet to make. (Tip: you can see <a href=\"http://baymard.com/ecommerce-product-lists/benchmark/page-types/sorting-tool\">46 different sorting interfaces</a> from the top US e-commerce sites we benchmarked for this study.)</p>\n\n<p>Category-specific sort types are ultimately about <strong>empowering users</strong> with the tools they need to reach the product selection they want and have it presented in a way that suits their unique interests. It’s an obvious opportunity to increase the return on existing product data investments, empower your users and get ahead of the competition.</p>\n"):
|
47049
|
+
|
47050
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47051
|
+
Started GET "/" for ::1 at 2017-12-14 11:36:15 +0100
|
47052
|
+
Processing by PagesController#show as HTML
|
47053
|
+
Completed 500 Internal Server Error in 570ms
|
47054
|
+
|
47055
|
+
|
47056
|
+
|
47057
|
+
ActionView::MissingTemplate (Missing template pages/show, application/show with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby]}. Searched in:
|
47058
|
+
* "/Users/jamieappleseed/Sites/baymard/plugins-and-scripts/anecdote/test/dummy/app/views"
|
47059
|
+
* "/Users/jamieappleseed/Sites/baymard/plugins-and-scripts/anecdote/app/views"
|
47060
|
+
):
|
47061
|
+
|
47062
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47063
|
+
Started GET "/" for ::1 at 2017-12-14 11:36:56 +0100
|
47064
|
+
Processing by PagesController#show as HTML
|
47065
|
+
Rendering text template
|
47066
|
+
Rendered text template (0.0ms)
|
47067
|
+
Completed 200 OK in 698ms (Views: 46.1ms)
|
47068
|
+
|
47069
|
+
|
47070
|
+
Started GET "/" for ::1 at 2017-12-14 11:37:59 +0100
|
47071
|
+
Processing by PagesController#show as HTML
|
47072
|
+
Rendering html template within layouts/application
|
47073
|
+
Rendered html template within layouts/application (0.1ms)
|
47074
|
+
Completed 200 OK in 797ms (Views: 174.6ms)
|
47075
|
+
|
47076
|
+
|
47077
|
+
Started GET "/assets/application.self-498cef3368860b1704871d187f16c8fffaa3430695c6575010040d0a2b38aa49.css?body=1" for ::1 at 2017-12-14 11:38:01 +0100
|
47078
|
+
Started GET "/" for ::1 at 2017-12-14 11:55:31 +0100
|
47079
|
+
Processing by PagesController#show as HTML
|
47080
|
+
Completed 500 Internal Server Error in 908ms
|
47081
|
+
|
47082
|
+
|
47083
|
+
|
47084
|
+
TypeError (no implicit conversion of nil into String):
|
47085
|
+
|
47086
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47087
|
+
Started GET "/" for ::1 at 2017-12-14 11:56:03 +0100
|
47088
|
+
Processing by PagesController#show as HTML
|
47089
|
+
Rendering html template within layouts/application
|
47090
|
+
Rendered html template within layouts/application (0.1ms)
|
47091
|
+
Completed 200 OK in 1185ms (Views: 23.8ms)
|
47092
|
+
|
47093
|
+
|
47094
|
+
Started GET "/" for ::1 at 2017-12-14 11:56:41 +0100
|
47095
|
+
Processing by PagesController#show as HTML
|
47096
|
+
Rendering html template within layouts/application
|
47097
|
+
Rendered html template within layouts/application (0.1ms)
|
47098
|
+
Completed 200 OK in 543ms (Views: 13.2ms)
|
47099
|
+
|
47100
|
+
|
47101
|
+
Started GET "/" for ::1 at 2017-12-14 11:57:07 +0100
|
47102
|
+
Processing by PagesController#show as HTML
|
47103
|
+
Rendering html template within layouts/application
|
47104
|
+
Rendered html template within layouts/application (0.1ms)
|
47105
|
+
Completed 200 OK in 1248ms (Views: 24.6ms)
|
47106
|
+
|
47107
|
+
|
47108
|
+
Started GET "/" for ::1 at 2017-12-14 11:57:16 +0100
|
47109
|
+
Processing by PagesController#show as HTML
|
47110
|
+
Rendering html template within layouts/application
|
47111
|
+
Rendered html template within layouts/application (0.1ms)
|
47112
|
+
Completed 200 OK in 625ms (Views: 9.6ms)
|
47113
|
+
|
47114
|
+
|
47115
|
+
Started GET "/" for ::1 at 2017-12-14 11:57:22 +0100
|
47116
|
+
Processing by PagesController#show as HTML
|
47117
|
+
Rendering html template within layouts/application
|
47118
|
+
Rendered html template within layouts/application (0.1ms)
|
47119
|
+
Completed 200 OK in 636ms (Views: 11.0ms)
|
47120
|
+
|
47121
|
+
|
47122
|
+
Started GET "/" for ::1 at 2017-12-14 11:57:28 +0100
|
47123
|
+
Processing by PagesController#show as HTML
|
47124
|
+
Completed 500 Internal Server Error in 751ms
|
47125
|
+
|
47126
|
+
|
47127
|
+
|
47128
|
+
RuntimeError (grrr):
|
47129
|
+
|
47130
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47131
|
+
Started GET "/" for ::1 at 2017-12-14 11:58:21 +0100
|
47132
|
+
Processing by PagesController#show as HTML
|
47133
|
+
Completed 500 Internal Server Error in 719ms
|
47134
|
+
|
47135
|
+
|
47136
|
+
|
47137
|
+
RuntimeError ({:formats=>"web", :_yield_=>"\nWe considered naming this article \"the sort type all users want but zero sites offer\" because category-specific sorting really is one of those rare instances where an obvious feature has somehow been **completely overlooked** by the e-commerce community.\n"}):
|
47138
|
+
|
47139
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47140
|
+
Started GET "/" for ::1 at 2017-12-14 11:59:03 +0100
|
47141
|
+
Processing by PagesController#show as HTML
|
47142
|
+
Completed 500 Internal Server Error in 100ms
|
47143
|
+
|
47144
|
+
|
47145
|
+
|
47146
|
+
RuntimeError ({:formats=>"web", :_scope_=>{:format=>:web}, :_yield_=>"\nWe considered naming this article \"the sort type all users want but zero sites offer\" because category-specific sorting really is one of those rare instances where an obvious feature has somehow been **completely overlooked** by the e-commerce community.\n"}):
|
47147
|
+
|
47148
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47149
|
+
Started GET "/" for ::1 at 2017-12-14 11:59:34 +0100
|
47150
|
+
Processing by PagesController#show as HTML
|
47151
|
+
Completed 500 Internal Server Error in 978ms
|
47152
|
+
|
47153
|
+
|
47154
|
+
|
47155
|
+
NoMethodError (undefined method `tag' for nil:NilClass):
|
47156
|
+
|
47157
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47158
|
+
Started GET "/" for ::1 at 2017-12-14 12:02:54 +0100
|
47159
|
+
Processing by PagesController#show as HTML
|
47160
|
+
Completed 500 Internal Server Error in 208ms
|
47161
|
+
|
47162
|
+
|
47163
|
+
|
47164
|
+
NoMethodError (undefined method `tag' for nil:NilClass):
|
47165
|
+
|
47166
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47167
|
+
Started GET "/" for ::1 at 2017-12-14 12:03:33 +0100
|
47168
|
+
Processing by PagesController#show as HTML
|
47169
|
+
Completed 500 Internal Server Error in 910ms
|
47170
|
+
|
47171
|
+
|
47172
|
+
|
47173
|
+
NoMethodError (undefined method `tag' for nil:NilClass):
|
47174
|
+
|
47175
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47176
|
+
Started GET "/" for ::1 at 2017-12-14 12:03:49 +0100
|
47177
|
+
Processing by PagesController#show as HTML
|
47178
|
+
Rendering html template within layouts/application
|
47179
|
+
Rendered html template within layouts/application (0.2ms)
|
47180
|
+
Completed 200 OK in 582ms (Views: 18.3ms)
|
47181
|
+
|
47182
|
+
|
47183
|
+
Started GET "/" for ::1 at 2017-12-14 12:04:35 +0100
|
47184
|
+
Processing by PagesController#show as HTML
|
47185
|
+
Rendering html template within layouts/application
|
47186
|
+
Rendered html template within layouts/application (0.0ms)
|
47187
|
+
Completed 200 OK in 575ms (Views: 8.2ms)
|
47188
|
+
|
47189
|
+
|
47190
|
+
Started GET "/" for ::1 at 2017-12-14 12:04:45 +0100
|
47191
|
+
Processing by PagesController#show as HTML
|
47192
|
+
Completed 500 Internal Server Error in 848ms
|
47193
|
+
|
47194
|
+
|
47195
|
+
|
47196
|
+
NoMethodError (undefined method `[]' for nil:NilClass):
|
47197
|
+
|
47198
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47199
|
+
Started GET "/" for ::1 at 2017-12-14 12:07:58 +0100
|
47200
|
+
Processing by PagesController#show as HTML
|
47201
|
+
Rendering html template within layouts/application
|
47202
|
+
Rendered html template within layouts/application (0.2ms)
|
47203
|
+
Completed 200 OK in 93251ms (Views: 24.2ms)
|
47204
|
+
|
47205
|
+
|
47206
|
+
Started GET "/" for ::1 at 2017-12-14 12:09:37 +0100
|
47207
|
+
Processing by PagesController#show as HTML
|
47208
|
+
Completed 500 Internal Server Error in 74805ms
|
47209
|
+
|
47210
|
+
|
47211
|
+
|
47212
|
+
NoMethodError (undefined method `tag' for nil:NilClass):
|
47213
|
+
|
47214
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47215
|
+
Started GET "/" for ::1 at 2017-12-14 12:11:57 +0100
|
47216
|
+
Processing by PagesController#show as HTML
|
47217
|
+
Rendering html template within layouts/application
|
47218
|
+
Rendered html template within layouts/application (0.1ms)
|
47219
|
+
Completed 200 OK in 1391ms (Views: 22.8ms)
|
47220
|
+
|
47221
|
+
|
47222
|
+
Started GET "/" for ::1 at 2017-12-14 12:12:14 +0100
|
47223
|
+
Processing by PagesController#show as HTML
|
47224
|
+
Rendering html template within layouts/application
|
47225
|
+
Rendered html template within layouts/application (0.1ms)
|
47226
|
+
Completed 200 OK in 657ms (Views: 51.6ms)
|
47227
|
+
|
47228
|
+
|
47229
|
+
Started GET "/" for ::1 at 2017-12-14 12:12:24 +0100
|
47230
|
+
Processing by PagesController#show as HTML
|
47231
|
+
Rendering html template within layouts/application
|
47232
|
+
Rendered html template within layouts/application (0.1ms)
|
47233
|
+
Completed 200 OK in 611ms (Views: 7.8ms)
|
47234
|
+
|
47235
|
+
|
47236
|
+
Started GET "/" for ::1 at 2017-12-14 12:12:28 +0100
|
47237
|
+
Processing by PagesController#show as HTML
|
47238
|
+
Rendering html template within layouts/application
|
47239
|
+
Rendered html template within layouts/application (0.1ms)
|
47240
|
+
Completed 200 OK in 581ms (Views: 11.4ms)
|
47241
|
+
|
47242
|
+
|
47243
|
+
Started GET "/" for ::1 at 2017-12-14 12:12:39 +0100
|
47244
|
+
Processing by PagesController#show as HTML
|
47245
|
+
Completed 500 Internal Server Error in 111ms
|
47246
|
+
|
47247
|
+
|
47248
|
+
|
47249
|
+
NoMethodError (undefined method `[]' for nil:NilClass):
|
47250
|
+
|
47251
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47252
|
+
Started GET "/" for ::1 at 2017-12-14 12:13:39 +0100
|
47253
|
+
Processing by PagesController#show as HTML
|
47254
|
+
Rendering html template within layouts/application
|
47255
|
+
Rendered html template within layouts/application (0.1ms)
|
47256
|
+
Completed 200 OK in 1356ms (Views: 22.3ms)
|
47257
|
+
|
47258
|
+
|
47259
|
+
Started GET "/" for ::1 at 2017-12-14 12:14:03 +0100
|
47260
|
+
Processing by PagesController#show as HTML
|
47261
|
+
Rendering html template within layouts/application
|
47262
|
+
Rendered html template within layouts/application (0.1ms)
|
47263
|
+
Completed 200 OK in 537ms (Views: 8.7ms)
|
47264
|
+
|
47265
|
+
|
47266
|
+
Started GET "/" for ::1 at 2017-12-14 12:14:08 +0100
|
47267
|
+
Processing by PagesController#show as HTML
|
47268
|
+
Rendering html template within layouts/application
|
47269
|
+
Rendered html template within layouts/application (0.0ms)
|
47270
|
+
Completed 200 OK in 593ms (Views: 10.3ms)
|
47271
|
+
|
47272
|
+
|
47273
|
+
Started GET "/" for ::1 at 2017-12-14 12:14:21 +0100
|
47274
|
+
Processing by PagesController#show as HTML
|
47275
|
+
Rendering html template within layouts/application
|
47276
|
+
Rendered html template within layouts/application (0.1ms)
|
47277
|
+
Completed 200 OK in 1333ms (Views: 21.5ms)
|
47278
|
+
|
47279
|
+
|
47280
|
+
Started GET "/" for ::1 at 2017-12-14 12:14:35 +0100
|
47281
|
+
Processing by PagesController#show as HTML
|
47282
|
+
Rendering html template within layouts/application
|
47283
|
+
Rendered html template within layouts/application (0.1ms)
|
47284
|
+
Completed 200 OK in 552ms (Views: 9.2ms)
|
47285
|
+
|
47286
|
+
|
47287
|
+
Started GET "/" for ::1 at 2017-12-14 12:14:42 +0100
|
47288
|
+
Processing by PagesController#show as HTML
|
47289
|
+
Rendering html template within layouts/application
|
47290
|
+
Rendered html template within layouts/application (0.0ms)
|
47291
|
+
Completed 200 OK in 636ms (Views: 8.7ms)
|
47292
|
+
|
47293
|
+
|
47294
|
+
Started GET "/" for ::1 at 2017-12-14 12:14:54 +0100
|
47295
|
+
Processing by PagesController#show as HTML
|
47296
|
+
Rendering html template within layouts/application
|
47297
|
+
Rendered html template within layouts/application (0.3ms)
|
47298
|
+
Completed 200 OK in 580ms (Views: 12.5ms)
|
47299
|
+
|
47300
|
+
|
47301
|
+
Started GET "/" for ::1 at 2017-12-14 12:15:00 +0100
|
47302
|
+
Processing by PagesController#show as HTML
|
47303
|
+
Rendering html template within layouts/application
|
47304
|
+
Rendered html template within layouts/application (0.1ms)
|
47305
|
+
Completed 200 OK in 566ms (Views: 9.0ms)
|
47306
|
+
|
47307
|
+
|
47308
|
+
Started GET "/" for ::1 at 2017-12-14 12:24:48 +0100
|
47309
|
+
Processing by PagesController#show as HTML
|
47310
|
+
Rendering html template within layouts/application
|
47311
|
+
Rendered html template within layouts/application (0.1ms)
|
47312
|
+
Completed 200 OK in 1364ms (Views: 21.3ms)
|
47313
|
+
|
47314
|
+
|
47315
|
+
Started GET "/" for ::1 at 2017-12-14 12:25:05 +0100
|
47316
|
+
Processing by PagesController#show as HTML
|
47317
|
+
Rendering html template within layouts/application
|
47318
|
+
Rendered html template within layouts/application (0.1ms)
|
47319
|
+
Completed 200 OK in 545ms (Views: 9.1ms)
|
47320
|
+
|
47321
|
+
|
47322
|
+
Started GET "/" for ::1 at 2017-12-14 12:25:15 +0100
|
47323
|
+
Processing by PagesController#show as HTML
|
47324
|
+
Completed 500 Internal Server Error in 98ms
|
47325
|
+
|
47326
|
+
|
47327
|
+
|
47328
|
+
NoMethodError (undefined method `split' for nil:NilClass):
|
47329
|
+
|
47330
|
+
app/controllers/pages_controller.rb:5:in `show'
|
47331
|
+
Started GET "/" for ::1 at 2017-12-14 12:25:19 +0100
|
47332
|
+
Processing by PagesController#show as HTML
|
47333
|
+
Rendering html template within layouts/application
|
47334
|
+
Rendered html template within layouts/application (0.0ms)
|
47335
|
+
Completed 200 OK in 555ms (Views: 10.2ms)
|
47336
|
+
|
47337
|
+
|
47338
|
+
Started GET "/" for ::1 at 2017-12-14 12:25:28 +0100
|
47339
|
+
Processing by PagesController#show as HTML
|
47340
|
+
Rendering html template within layouts/application
|
47341
|
+
Rendered html template within layouts/application (0.0ms)
|
47342
|
+
Completed 200 OK in 561ms (Views: 7.1ms)
|
47343
|
+
|
47344
|
+
|
47345
|
+
Started GET "/" for ::1 at 2017-12-14 12:25:34 +0100
|
47346
|
+
Processing by PagesController#show as HTML
|
47347
|
+
Rendering html template within layouts/application
|
47348
|
+
Rendered html template within layouts/application (0.1ms)
|
47349
|
+
Completed 200 OK in 647ms (Views: 9.4ms)
|
47350
|
+
|
47351
|
+
|