diff --git a/lib/formtastic/inputs/base/collections.rb b/lib/formtastic/inputs/base/collections.rb index b2a94035b..1e370c00b 100644 --- a/lib/formtastic/inputs/base/collections.rb +++ b/lib/formtastic/inputs/base/collections.rb @@ -87,6 +87,13 @@ def send_or_call(duck, object) object.send(duck) end end + + # Avoids an issue where `send_or_call` can be a String and duck can be something simple like + # `:first`, which obviously String responds to. + def send_or_call_or_object(duck, object) + return object if object.is_a?(String) # TODO what about other classes etc? + send_or_call(duck, object) + end end end diff --git a/lib/formtastic/inputs/check_boxes_input.rb b/lib/formtastic/inputs/check_boxes_input.rb index c3b319c2e..aaab1c943 100644 --- a/lib/formtastic/inputs/check_boxes_input.rb +++ b/lib/formtastic/inputs/check_boxes_input.rb @@ -154,7 +154,7 @@ def disabled?(value) def selected_values if object.respond_to?(method) selected_items = [object.send(method)].compact.flatten - [*selected_items.map { |o| send_or_call(value_method, o) }].compact + [*selected_items.map { |o| send_or_call_or_object(value_method, o) }].compact else [] end diff --git a/spec/inputs/check_boxes_input_spec.rb b/spec/inputs/check_boxes_input_spec.rb index dc42438ba..3989fedb1 100644 --- a/spec/inputs/check_boxes_input_spec.rb +++ b/spec/inputs/check_boxes_input_spec.rb @@ -361,7 +361,7 @@ before do @output_buffer = '' mock_everything - @fred.stub(:genres) { ['ficton', 'biography'] } + @fred.stub(:genres) { ['fiction', 'biography'] } concat(semantic_form_for(@fred) do |builder| concat(builder.input(:genres, :as => :check_boxes, :collection => [['Fiction', 'fiction'], ['Non-fiction', 'non_fiction'], ['Biography', 'biography']]))