简体   繁体   English

activeadmin with rails API app errors:Admin :: DashboardController #index中的ArgumentError

[英]activeadmin with rails API app errors: ArgumentError in Admin::DashboardController#index

I am trying to incorporate active admin with a rails_api app. 我正在尝试将活动管理员rails_api应用程序合并。

Details: 细节:

Because it is an API, with no cookies and stuffs, I am using devise_auth_token for authentication ( not devise ). 因为它是一个API,没有cookie和东西,我使用devise_auth_token进行身份验证(不是设计 )。

The authentication is working perfectly. 身份验证工作正常。 However, I'm now trying to incorporate active admin with this, and followed the steps: 但是,我现在正尝试将活动管理员与此相结合,并按照以下步骤操作:

gem 'activeadmin', '1.0.0.pre2'
$ bundle install
$ rails g active_admin:install 
$ rake db:migrate db:seed
$rails server

On going to http://localhost:3000/admin , it blew up with following error: 在转到http:// localhost:3000 / admin时 ,它出现以下错误:

ArgumentError in Admin::DashboardController#index
wrong number of arguments (given 1, expected 0)

pointing to a line: define_method(name) do in: 指向一行: define_method(name) do in:

 if instance_reader
    remove_possible_method name
    define_method(name) do
      if instance_variable_defined?(ivar)
        instance_variable_get ivar
      else

Note however that going directly to http://localhost:3000/admin/login opens the login page, but after login, it redirects back to http://localhost:3000/admin with same error message. 但请注意,直接转到http:// localhost:3000 / admin / login会打开登录页面,但在登录后,它会重定向回http:// localhost:3000 / admin并显示相同的错误消息。

Gemfile: 的Gemfile:

gem 'pg'
gem 'devise'
gem 'devise_token_auth'
gem 'omniauth'
gem 'money-rails'
gem 'swagger-docs'
gem 'activeadmin', '1.0.0.pre2'gem 'pg'
gem 'devise'
gem 'devise_token_auth'
gem 'omniauth'
gem 'money-rails'
gem 'swagger-docs'
gem 'activeadmin', '1.0.0.pre2'

Routes.rb: routes.rb中:

Rails.application.routes.draw do
  devise_for :admin_users, ActiveAdmin::Devise.config
  ActiveAdmin.routes(self)
  namespace :api do
    namespace :v1 do
      mount_devise_token_auth_for 'User', at: 'auth'
      ...
    end
  end
  root to: "home#index"
end

Dependencies: 依赖关系:

  • Ruby: 2.3.0 Ruby:2.3.0
  • Rails: 4.2.4 Rails:4.2.4
  • Active Admin: 1.0.0.pre2 活动管理员:1.0.0.pre2
  • Rails API: 0.4.0 Rails API:0.4.0
  • Devise: 3.5.6 设计:3.5.6
  • Devise token auth: 0.1.37 设计令牌身份验证:0.1.37

Stack trace: 堆栈跟踪:

ArgumentError (wrong number of arguments (given 1, expected 0)):
  activesupport (4.2.4) lib/active_support/core_ext/class/attribute.rb:106:in `block (2 levels) in class_attribute'
  devise_token_auth (0.1.37) app/controllers/devise_token_auth/concerns/set_user_by_token.rb:21:in `set_user_by_token'
  devise_token_auth (0.1.37) lib/devise_token_auth/controllers/helpers.rb:117:in `current_admin_user'
  devise_token_auth (0.1.37) lib/devise_token_auth/controllers/helpers.rb:105:in `authenticate_admin_user!'
  activeadmin (1.0.0.pre2) lib/active_admin/base_controller.rb:39:in `authenticate_active_admin_user'
  activesupport (4.2.4) lib/active_support/callbacks.rb:432:in `block in make_lambda'
  activesupport (4.2.4) lib/active_support/callbacks.rb:164:in `block in halting'
  activesupport (4.2.4) lib/active_support/callbacks.rb:504:in `block in call'
  activesupport (4.2.4) lib/active_support/callbacks.rb:504:in `each'
  activesupport (4.2.4) lib/active_support/callbacks.rb:504:in `call'
  activesupport (4.2.4) lib/active_support/callbacks.rb:92:in `__run_callbacks__'
  activesupport (4.2.4) lib/active_support/callbacks.rb:778:in `_run_process_action_callbacks'
  activesupport (4.2.4) lib/active_support/callbacks.rb:81:in `run_callbacks'
  actionpack (4.2.4) lib/abstract_controller/callbacks.rb:19:in `process_action'
  actionpack (4.2.4) lib/action_controller/metal/rescue.rb:29:in `process_action'
  actionpack (4.2.4) lib/action_controller/metal/instrumentation.rb:32:in `block in process_action'
  activesupport (4.2.4) lib/active_support/notifications.rb:164:in `block in instrument'
  activesupport (4.2.4) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
  activesupport (4.2.4) lib/active_support/notifications.rb:164:in `instrument'
  actionpack (4.2.4) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
  actionpack (4.2.4) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
  activerecord (4.2.4) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
  actionpack (4.2.4) lib/abstract_controller/base.rb:137:in `process'
  actionview (4.2.4) lib/action_view/rendering.rb:30:in `process'
  actionpack (4.2.4) lib/action_controller/metal.rb:196:in `dispatch'
  actionpack (4.2.4) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
  actionpack (4.2.4) lib/action_controller/metal.rb:237:in `block in action'
  actionpack (4.2.4) lib/action_dispatch/routing/route_set.rb:76:in `dispatch'
  actionpack (4.2.4) lib/action_dispatch/routing/route_set.rb:45:in `serve'
  actionpack (4.2.4) lib/action_dispatch/journey/router.rb:43:in `block in serve'
  actionpack (4.2.4) lib/action_dispatch/journey/router.rb:30:in `each'
  actionpack (4.2.4) lib/action_dispatch/journey/router.rb:30:in `serve'
  actionpack (4.2.4) lib/action_dispatch/routing/route_set.rb:821:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/flash.rb:260:in `call'
  warden (1.2.6) lib/warden/manager.rb:35:in `block in call'
  warden (1.2.6) lib/warden/manager.rb:34:in `catch'
  warden (1.2.6) lib/warden/manager.rb:34:in `call'
  rack (1.6.4) lib/rack/etag.rb:24:in `call'
  rack (1.6.4) lib/rack/conditionalget.rb:25:in `call'
  rack (1.6.4) lib/rack/head.rb:13:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
  activerecord (4.2.4) lib/active_record/query_cache.rb:36:in `call'
  activerecord (4.2.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:653:in `call'
  activerecord (4.2.4) lib/active_record/migration.rb:377:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
  activesupport (4.2.4) lib/active_support/callbacks.rb:88:in `__run_callbacks__'
  activesupport (4.2.4) lib/active_support/callbacks.rb:778:in `_run_call_callbacks'
  activesupport (4.2.4) lib/active_support/callbacks.rb:81:in `run_callbacks'
  actionpack (4.2.4) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/reloader.rb:73:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/remote_ip.rb:78:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.2.4) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.2.4) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.2.4) lib/active_support/tagged_logging.rb:68:in `block in tagged'
  activesupport (4.2.4) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.2.4) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.2.4) lib/rails/rack/logger.rb:20:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.6.4) lib/rack/runtime.rb:18:in `call'
  activesupport (4.2.4) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
  rack (1.6.4) lib/rack/lock.rb:17:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/static.rb:116:in `call'
  railties (4.2.4) lib/rails/engine.rb:518:in `call'
  railties (4.2.4) lib/rails/application.rb:165:in `call'
  rack (1.6.4) lib/rack/lock.rb:17:in `call'
  rack (1.6.4) lib/rack/content_length.rb:15:in `call'
  rack (1.6.4) lib/rack/handler/webrick.rb:88:in `service'
  /Users/Sunday/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service'
  /Users/Sunday/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run'
  /Users/Sunday/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread'

I am suspecting it may have to do with the fact that rails_api does not include several rails middleware by default... but really, I don't know what it is, or how I can go about it. 我怀疑它可能与rails_api默认情况下不包含几个rails中间件的事实有关......但实际上,我不知道它是什么,或者我怎么能去做。 Please anyone, I need help on this. 请任何人,我需要帮助。

Will my combination even work at all? 我的组合甚至可以工作吗?

This is an issue while using the devise_auth_token with active_admin devise_auth_tokenactive_admin一起使用时,这是一个问题

This is the Work around given in the devise_token_auth gem itself. 这是devise_token_auth gem本身给出的devise_token_auth

For some odd reason, ActiveAdmin extends from your own app's ApplicationController. 出于某种奇怪的原因,ActiveAdmin从您自己的应用程序的ApplicationController扩展而来。 This becomes a problem if you include the DeviseTokenAuth::Concerns::SetUserByToken concern in your app's ApplicationController. 如果您在应用程序的ApplicationController中包含DeviseTokenAuth :: Concerns :: SetUserByToken问题,这将成为一个问题。

The solution is to use two separate ApplicationController classes - one for your API, and one for ActiveAdmin. 解决方案是使用两个单独的ApplicationController类 - 一个用于API,另一个用于ActiveAdmin。 Something like this: 像这样的东西:

app/controllers/api_controller.rb 应用程序/控制器/ api_controller.rb

API routes extend from this controller API路由从此控制器扩展

class ApiController < ActionController::Base
  include DeviseTokenAuth::Concerns::SetUserByToken
end

app/controllers/application_controller.rb 应用程序/控制器/ application_controller.rb

leave this for ActiveAdmin, and any other non-api routes 将此保留给ActiveAdmin和任何其他非api路由

class ApplicationController < ActionController::Base
end

This is the reference 这是参考

This is defiantly not a very good combo. 这绝对不是一个很好的组合。

Rails API is meant as a scaled down version of Rails for applications which do not have a normal web interface - its faster because it strips out components which are needed for classical web apps such as sessions. 对于没有普通Web界面的应用程序,Rails API意味着Rails的缩小版本 - 它更快,因为它剥离了经典Web应用程序(如会话)所需的组件。

These components are known as middleware. 这些组件称为中间件。

ActiveAdmin is a quick and easy web interface for doing CRUD on your models. ActiveAdmin是一个快速简便的Web界面,用于在模型上进行CRUD。 So that human can edit data by clicking buttons instead of by using an API. 因此人类可以通过单击按钮而不是使用API​​来编辑数据。

What you might want to do instead is have two separate rails apps - one that serves data via the API and a web app that lets humans use ActiveAdmin. 您可能想要做的是拥有两个独立的rails应用程序 - 一个通过API提供数据的应用程序和一个允许人们使用ActiveAdmin的Web应用程序。 This is a rather common solution when you need a web app but don't want it to burden down your API. 当您需要一个Web应用程序但不希望它降低您的API负担时,这是一个相当常见的解决方案。

Each would live in its own GIT repository and be served by different servers. 每个都将存在于自己的GIT存储库中,并由不同的服务器提供服务。 You would share components such as models by extracting them into gem(s). 您可以通过将组件提取到gem(s)中来共享组件,例如模型。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM