cgriego / active_attr

What ActiveModel left out
MIT License
1.2k stars 91 forks source link

Issue when using with responders #155

Closed d3crypt3d closed 8 years ago

d3crypt3d commented 8 years ago

When I try to use a model instance with responders the controller raises an error: NoMethodError: undefined method `texts_url'

# app/models/text.rb
class Text
  include ActiveAttr::Model

  attribute :plain
  attribute :encrypted
  attribute :frequency
end

# app/controllers/crypt_controller.rb
class CryptController < ApplicationController
   respond_to :json

  def encrypt
    respond_with Text.new(plain: @text, encrypted: output, frequency: frequency_analisys(output)), status: :ok
  end
  # ...
end

ERROR NoMethodError: undefined method texts_url' for #<CryptController:0x000000074745f8> /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/polymorphic_routes.rb:220:inpolymorphic_method' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/polymorphic_routes.rb:114:in polymorphic_url' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/url_for.rb:164:inurl_for'

cgriego commented 8 years ago

I'm not sure why anything would be trying to create a URL from just this sample code. Can you provide the full backtrace?

d3crypt3d commented 8 years ago

/home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/polymorphic_routes.rb:220:in polymorphic_method' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/polymorphic_routes.rb:114:inpolymorphic_url' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/url_for.rb:164:in url_for' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/rendering.rb:95:in_process_options' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/streaming.rb:200:in _process_options' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/renderers.rb:43:inblock in _render_to_body_with_renderer' /home/workstat/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/set.rb:263:in each_key' /home/workstat/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/set.rb:263:ineach' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/renderers.rb:41:in _render_to_body_with_renderer' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/renderers.rb:37:inrender_to_body' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/abstract_controller/rendering.rb:25:in render' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/rendering.rb:16:inrender' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/instrumentation.rb:44:in block (2 levels) in render' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/core_ext/benchmark.rb:12:inblock in ms' /home/workstat/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/benchmark.rb:294:in realtime' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/core_ext/benchmark.rb:12:inms' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/instrumentation.rb:44:in block in render' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/instrumentation.rb:87:incleanup_view_runtime' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activerecord-4.2.5.1/lib/active_record/railties/controller_runtime.rb:25:in cleanup_view_runtime' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/instrumentation.rb:43:inrender' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/responders-2.1.1/lib/action_controller/responder.rb:258:in display' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/responders-2.1.1/lib/action_controller/responder.rb:214:inapi_behavior' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/responders-2.1.1/lib/action_controller/responder.rb:191:in rescue in to_format' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/responders-2.1.1/lib/action_controller/responder.rb:185:into_format' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/responders-2.1.1/lib/action_controller/responder.rb:163:in respond' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/responders-2.1.1/lib/action_controller/responder.rb:156:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/responders-2.1.1/lib/action_controller/respond_with.rb:205:in respond_with' /home/workstat/development/lightit_test_task/caesar_cipher/app/controllers/crypt_controller.rb:20:inencrypt' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/implicit_render.rb:4:in send_action' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/abstract_controller/base.rb:198:inprocess_action' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/rendering.rb:10:in process_action' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/abstract_controller/callbacks.rb:20:inblock in process_action' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:117:in call' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:117:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:555:in block (2 levels) in compile' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:505:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:505:in call' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:92:inrun_callbacks' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:778:in _run_process_action_callbacks' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:81:inrun_callbacks' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/abstract_controller/callbacks.rb:19:in process_action' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/rescue.rb:29:inprocess_action' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/instrumentation.rb:32:in block in process_action' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/notifications.rb:164:inblock in instrument' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/notifications/instrumenter.rb:20:in instrument' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/notifications.rb:164:ininstrument' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/instrumentation.rb:30:in process_action' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/params_wrapper.rb:250:inprocess_action' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activerecord-4.2.5.1/lib/active_record/railties/controller_runtime.rb:18:in process_action' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/abstract_controller/base.rb:137:inprocess' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionview-4.2.5.1/lib/action_view/rendering.rb:30:in process' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal.rb:196:indispatch' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal/rack_delegation.rb:13:in dispatch' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_controller/metal.rb:237:inblock in action' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/route_set.rb:74:in call' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/route_set.rb:74:indispatch' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/route_set.rb:43:in serve' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/journey/router.rb:43:inblock in serve' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/journey/router.rb:30:in each' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/journey/router.rb:30:inserve' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/route_set.rb:815:in call' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/rack-1.6.4/lib/rack/etag.rb:24:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/rack-1.6.4/lib/rack/conditionalget.rb:38:in call' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/rack-1.6.4/lib/rack/head.rb:13:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/params_parser.rb:27:in call' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/flash.rb:260:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/rack-1.6.4/lib/rack/session/abstract/id.rb:225:in context' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/rack-1.6.4/lib/rack/session/abstract/id.rb:220:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/cookies.rb:560:in call' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activerecord-4.2.5.1/lib/active_record/query_cache.rb:36:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:653:in call' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/callbacks.rb:29:inblock in call' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:88:in `run_callbacks' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:778:in_run_call_callbacks' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:81:inrun_callbacks' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/callbacks.rb:27:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/remote_ip.rb:78:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/debug_exceptions.rb:17:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/show_exceptions.rb:30:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/railties-4.2.5.1/lib/rails/rack/logger.rb:38:incall_app' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/railties-4.2.5.1/lib/rails/rack/logger.rb:20:inblock in call' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/tagged_logging.rb:68:inblock in tagged' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/tagged_logging.rb:26:intagged' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/tagged_logging.rb:68:intagged' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/railties-4.2.5.1/lib/rails/rack/logger.rb:20:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/request_id.rb:21:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/rack-1.6.4/lib/rack/methodoverride.rb:22:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/rack-1.6.4/lib/rack/runtime.rb:18:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/activesupport-4.2.5.1/lib/active_support/cache/strategy/local_cache_middleware.rb:28:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/rack-1.6.4/lib/rack/lock.rb:17:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/static.rb:116:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/rack-1.6.4/lib/rack/sendfile.rb:113:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/railties-4.2.5.1/lib/rails/engine.rb:518:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/railties-4.2.5.1/lib/rails/application.rb:165:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/rack-1.6.4/lib/rack/lock.rb:17:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/rack-1.6.4/lib/rack/content_length.rb:15:incall' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:inservice' /home/workstat/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/webrick/httpserver.rb:138:inservice' /home/workstat/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/webrick/httpserver.rb:94:inrun' /home/workstat/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/webrick/server.rb:295:in`block in start_thread'

cgriego commented 8 years ago

The reason this is happening is because the request is a POST, which the responders gem assumes is used for creating a resource and, like would be created when generating a Rails scaffold controller in a create action, the responders gem is trying to communicate the Location header for the resource and that's where it's trying to generate a URL for the given model. However there isn't a resources route defined for your Text model and that's why it fails. You could override the :location option if you have something suitable, but if not then the responders gem is probably too generalized for your use case.

      elsif post?
        display resource, :status => :created, :location => api_location