【问题标题】:TypeError: wrong argument type Class (expected Module) with Controller concernTypeError:与控制器有关的错误参数类型类(预期模块)
【发布时间】:2014-10-08 12:12:15
【问题描述】:

所以我有一个名为 guest_controller.rb 的控制器,它看起来像这样:

class GuestsController < ApplicationController
    include Data

    def index
        display_data("db")
        display_data("session")
    end

    def new
        @guest = Guest.new
    end

    def create
        case params[:option]
            when '0'
                logger.debug 'Salvestame andmebaasi'
                save_data("db")
            when '1'
                logger.debug 'Salvestame sessiooni'
                save_data("session")
        end
    end

    private
    def guest_params
        params.require(:guest).permit(:name, :text)
    end
end

而且我在 controllers/concens/ 中有一个名为 data.rb 的问题:

module Data
    extend ActiveSupport:Concern

    def save_data(save_method)
        case save_method
            when "db"
                @guest = Guest.new(guest_params)
                if @guest.save
                    flash[:success] = "New guest entry created!"
                    redirect_to guests_path
                else
                    render 'new'
                end
            when "session"
                name = params[:guest][:name].to_s
                text = params[:guest][:text].to_s

                @guests_session = session[:guests]

                if session[:guests].nil?
                    @guests_session = [{:name => 'temp', :text => 'temp'}]
                else
                    logger.debug @guests_session
                    @guests_session.push({:name => name, :text => text})
                end

                session[:guests] = @guests_session
                redirect_to guests_path
        end
    end

    def display_data(display_method)
        case display_method
            when "db"
                @guests = Guest.all
            when "session"
                if session[:guests].nil?
                    @guests_session = [{:name => 'temp', :text => 'temp'}]
                else
                    #@guests_session = [{:name => 'temp', :text => 'temp'}]
                    @guests_session = session[:guests]
                end
        end
    end
end

现在当我打开相应的视图时,我得到了这个错误:

GuestController#index 中的类型错误 错误的参数类型类(预期的模块)

使用堆栈跟踪:

app/controllers/guests_controller.rb:2:in `include'
app/controllers/guests_controller.rb:2:in `<class:GuestsController>'
app/controllers/guests_controller.rb:1:in `<top (required)>'
activesupport (4.1.5) lib/active_support/dependencies.rb:443:in `load'
activesupport (4.1.5) lib/active_support/dependencies.rb:443:in `block in load_file'
activesupport (4.1.5) lib/active_support/dependencies.rb:633:in `new_constants_in'
activesupport (4.1.5) lib/active_support/dependencies.rb:442:in `load_file'
activesupport (4.1.5) lib/active_support/dependencies.rb:342:in `require_or_load'
activesupport (4.1.5) lib/active_support/dependencies.rb:480:in `load_missing_constant'
activesupport (4.1.5) lib/active_support/dependencies.rb:180:in `const_missing'
activesupport (4.1.5) lib/active_support/inflector/methods.rb:238:in `const_get'
activesupport (4.1.5) lib/active_support/inflector/methods.rb:238:in `block in constantize'
activesupport (4.1.5) lib/active_support/inflector/methods.rb:236:in `each'
activesupport (4.1.5) lib/active_support/inflector/methods.rb:236:in `inject'
activesupport (4.1.5) lib/active_support/inflector/methods.rb:236:in `constantize'
activesupport (4.1.5) lib/active_support/dependencies.rb:552:in `get'
activesupport (4.1.5) lib/active_support/dependencies.rb:583:in `constantize'
actionpack (4.1.5) lib/action_dispatch/routing/route_set.rb:78:in `controller_reference'
actionpack (4.1.5) lib/action_dispatch/routing/route_set.rb:68:in `controller'
actionpack (4.1.5) lib/action_dispatch/routing/route_set.rb:46:in `call'
actionpack (4.1.5) lib/action_dispatch/journey/router.rb:71:in `block in call'
actionpack (4.1.5) lib/action_dispatch/journey/router.rb:59:in `each'
actionpack (4.1.5) lib/action_dispatch/journey/router.rb:59:in `call'
actionpack (4.1.5) lib/action_dispatch/routing/route_set.rb:678:in `call'
warden (1.2.3) lib/warden/manager.rb:35:in `block in call'
warden (1.2.3) lib/warden/manager.rb:34:in `catch'
warden (1.2.3) lib/warden/manager.rb:34:in `call'
rack (1.5.2) lib/rack/etag.rb:23:in `call'
rack (1.5.2) lib/rack/conditionalget.rb:25:in `call'
rack (1.5.2) lib/rack/head.rb:11:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/flash.rb:254:in `call'
rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context'
rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/cookies.rb:560:in `call'
activerecord (4.1.5) lib/active_record/query_cache.rb:36:in `call'
activerecord (4.1.5) lib/active_record/connection_adapters/abstract/connection_pool.rb:621:in `call'
activerecord (4.1.5) lib/active_record/migration.rb:380:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (4.1.5) lib/active_support/callbacks.rb:82:in `run_callbacks'
actionpack (4.1.5) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/reloader.rb:73:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.1.5) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.1.5) lib/rails/rack/logger.rb:20:in `block in call'
activesupport (4.1.5) lib/active_support/tagged_logging.rb:68:in `block in tagged'
activesupport (4.1.5) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (4.1.5) lib/active_support/tagged_logging.rb:68:in `tagged'
railties (4.1.5) lib/rails/rack/logger.rb:20:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
rack (1.5.2) lib/rack/runtime.rb:17:in `call'
activesupport (4.1.5) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call'
rack (1.5.2) lib/rack/lock.rb:17:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/static.rb:64:in `call'
rack (1.5.2) lib/rack/sendfile.rb:112:in `call'
railties (4.1.5) lib/rails/engine.rb:514:in `call'
railties (4.1.5) lib/rails/application.rb:144:in `call'
passenger (4.0.50) lib/phusion_passenger/rack/thread_handler_extension.rb:74:in `process_request'
passenger (4.0.50) lib/phusion_passenger/request_handler/thread_handler.rb:141:in `accept_and_process_next_request'
passenger (4.0.50) lib/phusion_passenger/request_handler/thread_handler.rb:109:in `main_loop'
passenger (4.0.50) lib/phusion_passenger/request_handler.rb:455:in `block (3 levels) in start_threads'

我基本上只是想学习如何在控制器中使用关注点。我想分离出一大段代码并将其放入相应的关注点,以保持控制器整洁。

在谷歌搜索或搜索 SO 以查找与控制器有关的问题时,没有什么可找到的,所以我提出了这个新问题,希望得到帮助。

那么如何解决这个问题,我做错了什么?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    您遇到了名称冲突 - Data 类存在于核心 Ruby 中:link here。这意味着 Rails 不会启动 const_missing 并且您的关注点永远不会加载。将您的关注重命名为 DateModule 或类似名称。

    【讨论】:

    • 领先我 2 秒 :-)
    • 谢谢,在之前的答案中阅读 cmets 后才知道。现在工作正常:)
    【解决方案2】:

    您在 Data 问题中犯了一个简单的错字 - 它应该是 extend ActiveSupport::Concern(注意双冒号,它是 Ruby 中的命名空间分隔符)。

    【讨论】:

    • 似乎确实是一个错字,但即使将其更改为:'extend ActiveSupport::Concern' 我似乎仍然遇到同样的错误。以防万一也重新启动了网络服务器。
    • 您的系统中是否还有一个名为 Data 的类?例如,模型?
    • 不,这似乎是唯一的一个。
    • 但也许它被rails中的某些东西使用了。我更改了名称,现在可以使用。谢谢!
    猜你喜欢
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2021-07-19
    • 2019-08-28
    • 2017-09-30
    相关资源
    最近更新 更多