У меня очень странная проблема, с которой я не могу справиться. Два приложения Rails, один - это API, у которого есть объект Mongo :: Enrollment, а другой - клиент, у которого есть сущность. Регистрация, связанная с API с помощью ActiveResource.Сообщение ActiveResource вызывает ошибку, при этом сообщение в моем браузере завершается успешно
Я определил мой /app/models/enrollment.rb на клиенте с ActiveResource, и в контроллере я делаю вызов так:
enrollment = Enrollment.post(:create, enrollment: {
:enrollment_type => :test,
:enrollment_information => {test: 'test information'}
})
Я знаю, что я могу использовать .new и .save здесь тоже, поскольку это ActiveResource, но он дает мне те же результаты.
Когда я на самом деле этот пост, я получаю следующее сообщение об ошибке в моем журнале:
RuntimeError (Circular dependency detected while autoloading constant Enrollment)
Но если я скопировать URL из моего журнала, вставьте его в Почтальон, используя ту же базовую аутентификацию, принимаю заголовок и POST метод, я не получаю никакой ошибки вообще, и это сохраняет регистрацию в mongodb.
Я действительно надеюсь, что кто-то может мне помочь. Я думаю, что очень странно, что то, что похоже на тот же HTTP-запрос, дает разные результаты. Я попытался перезапустить оба приложения и выполнить запрос по-разному с клиентом, но каждый раз, когда я делаю запрос от клиента, он дает мне ошибку выше. Контроллер и модель на стороне API кажутся прекрасными, у меня также есть интерфейс HTML в приложении API, и это работает отлично.
Это то, что я в моем API приложение:
Это определено в маршрутах просто:
resources :enrollments
В EnrollmentsController У меня есть
# /app/controllers/enrollments_controller.rb
class EnrollmentsController < ApplicationController
...
def create
@enrollment = Mongo::Enrollment.new(enrollment_parameters)
respond_to do |format|
if @enrollment.save
format.html { redirect_to @enrollment, notice: 'Note was successfully created.' }
format.json { render json: @enrollment }
else
format.html { render action: 'new' }
format.json { render json: @enrollment.errors, status: :unprocessable_entity }
end
end
end
...
end
Это моя модель:
# /app/models/mongo/enrollment.rb
module Mongo
class Enrollment
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::Paranoia
default_scope ->{ where(processed: false)}
field :processed, :type => Boolean, :default => false
field :accepted, :type => Boolean, :default => false
field :enrollment_type
field :enrollment_information, :type => Hash, :default => {}
end
end
Трассировка полного стека:
Started POST "/api/v1.0/enrollments/create.json?enrollment..." for 127.0.0.1 at 2014-08-31 10:12:33 -0400
RuntimeError (Circular dependency detected while autoloading constant Enrollment):
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:461:in `load_missing_constant'
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:184:in `const_missing'
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/inflector/methods.rb:226:in `const_get'
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/inflector/methods.rb:226:in `block in constantize'
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/inflector/methods.rb:224:in `each'
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/inflector/methods.rb:224:in `inject'
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/inflector/methods.rb:224:in `constantize'
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/inflector/methods.rb:269:in `safe_constantize'
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/core_ext/string/inflections.rb:77:in `safe_constantize'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_controller/metal/params_wrapper.rb:145:in `_default_wrap_model'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_controller/metal/params_wrapper.rb:96:in `block in model'
/usr/local/rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/mutex_m.rb:73:in `synchronize'
/usr/local/rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/mutex_m.rb:73:in `mu_synchronize'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_controller/metal/params_wrapper.rb:96:in `model'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_controller/metal/params_wrapper.rb:119:in `name'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_controller/metal/params_wrapper.rb:252:in `_wrapper_key'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_controller/metal/params_wrapper.rb:275:in `_wrapper_enabled?'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_controller/metal/params_wrapper.rb:233:in `process_action'
vendor/bundle/ruby/2.1.0/gems/activerecord-4.0.2/lib/active_record/railties/controller_runtime.rb:18:in `process_action'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/abstract_controller/base.rb:136:in `process'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/abstract_controller/rendering.rb:44:in `process'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_controller/metal.rb:195:in `dispatch'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_controller/metal.rb:231:in `block in action'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/routing/route_set.rb:80:in `call'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/routing/route_set.rb:80:in `dispatch'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/routing/route_set.rb:48:in `call'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/journey/router.rb:71:in `block in call'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/journey/router.rb:59:in `each'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/journey/router.rb:59:in `call'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/routing/route_set.rb:680:in `call'
vendor/bundle/ruby/2.1.0/gems/warden-1.2.3/lib/warden/manager.rb:35:in `block in call'
vendor/bundle/ruby/2.1.0/gems/warden-1.2.3/lib/warden/manager.rb:34:in `catch'
vendor/bundle/ruby/2.1.0/gems/warden-1.2.3/lib/warden/manager.rb:34:in `call'
vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/etag.rb:23:in `call'
vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/conditionalget.rb:35:in `call'
vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/head.rb:11:in `call'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/params_parser.rb:27:in `call'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/flash.rb:241:in `call'
vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/session/abstract/id.rb:225:in `context'
vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/session/abstract/id.rb:220:in `call'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/cookies.rb:486:in `call'
vendor/bundle/ruby/2.1.0/gems/activerecord-4.0.2/lib/active_record/query_cache.rb:36:in `call'
vendor/bundle/ruby/2.1.0/gems/activerecord-4.0.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:626:in `call'
vendor/bundle/ruby/2.1.0/gems/activerecord-4.0.2/lib/active_record/migration.rb:369:in `call'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/callbacks.rb:373:in `_run__928559686495229391__call__callbacks'
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/callbacks.rb:80:in `run_callbacks'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/callbacks.rb:27:in `call'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/reloader.rb:64:in `call'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
vendor/bundle/ruby/2.1.0/gems/railties-4.0.2/lib/rails/rack/logger.rb:38:in `call_app'
vendor/bundle/ruby/2.1.0/gems/railties-4.0.2/lib/rails/rack/logger.rb:20:in `block in call'
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/tagged_logging.rb:67:in `block in tagged'
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/tagged_logging.rb:25:in `tagged'
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/tagged_logging.rb:67:in `tagged'
vendor/bundle/ruby/2.1.0/gems/railties-4.0.2/lib/rails/rack/logger.rb:20:in `call'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/request_id.rb:21:in `call'
vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/methodoverride.rb:21:in `call'
vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/runtime.rb:17:in `call'
vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.2/lib/active_support/cache/strategy/local_cache.rb:83:in `call'
vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/lock.rb:17:in `call'
vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/static.rb:64:in `call'
vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/sendfile.rb:112:in `call'
vendor/bundle/ruby/2.1.0/gems/railties-4.0.2/lib/rails/engine.rb:511:in `call'
vendor/bundle/ruby/2.1.0/gems/railties-4.0.2/lib/rails/application.rb:97:in `call'
/usr/local/rvm/gems/ruby-2.1.1/gems/passenger-4.0.48/lib/phusion_passenger/rack/thread_handler_extension.rb:74:in `process_request'
/usr/local/rvm/gems/ruby-2.1.1/gems/passenger-4.0.48/lib/phusion_passenger/request_handler/thread_handler.rb:141:in `accept_and_process_next_request'
/usr/local/rvm/gems/ruby-2.1.1/gems/passenger-4.0.48/lib/phusion_passenger/request_handler/thread_handler.rb:109:in `main_loop'
/usr/local/rvm/gems/ruby-2.1.1/gems/passenger-4.0.48/lib/phusion_passenger/request_handler.rb:448:in `block (3 levels) in start_threads'
Rendered vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.9ms)
Rendered vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.0ms)
Rendered vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.8ms)
Rendered vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (20.3ms)
Спасибо!
Похоже, что код упаковки параметров смущен тем, что модель - Mongo :: Enrollments. Вы можете отключить это, если вам это не нужно (может быть, есть инициализатор wrap_parameters где-то) –
Спасибо, это то, что говорят мне документы: «Обертывает хэш параметров во вложенный хеш. Это позволит клиентам отправлять POST запросы без указания каких-либо корневых элементов. ". Означает ли это, что полная переменная params не будет анализироваться как вложенный хеш, если я отключу ее? Если это так, мне это нужно. Или это означает, что он просто не вводит «регистрацию» в качестве корня? Потому что тогда мне это действительно не нужно. – Chris
Это означает, что если не существует ключевого слова «регистрация», тогда весь набор параметров будет завернут в один. –