【问题标题】:Declare type of instance variable on controller在控制器上声明实例变量的类型
【发布时间】:2018-04-05 13:52:35
【问题描述】:

我在 Amber 框架上使用 Jennifer.cr 有一个水晶语言项目,但我的控制器上出现此错误:

Can't infer the type of instance variable '@companies' of CompanyController
@companies = Company.all

控制器是:

class CompanyController < ApplicationController
  def index
    @companies = Company.all
    render("index.slang")
  end
end

当我尝试以这种方式解决问题时:

class CompanyController < ApplicationController
  def index
    @companies : Array(Company) = Company.all
    render("index.slang")
  end
end

我又遇到了一个错误:

instantiating 'CompanyController#index()'
in src/controllers/company_controller.cr:7: declaring the type of an instance variable must be done at the class level

    @companies : Array(Company) = Company.all

我该如何解决这个“简单”的问题?

【问题讨论】:

    标签: crystal-lang amber-framework


    【解决方案1】:

    您不必在这里使用实例变量。局部变量是 Amber 应用默认使用的一种方式(它们可以在视图中访问):

    class CompanyController < ApplicationController
      def index
        companies = Company.all
        render("index.slang")
      end
    end
    

    但是如果由于某种原因要使用实例变量,则需要在类级别或follow other type inference rules进行声明和初始化。

    【讨论】:

      【解决方案2】:

      如前所述,这里使用局部变量是最优雅的解决方案。对于在不同上下文中出现类似错误消息的人,请阅读以下内容:

      第二条错误消息已经指向正确的解决方案,下面的代码也应该可以工作:

      class CompanyController < ApplicationController
        @companies : Array(Company)?
      
        def index
          @companies = Company.all
          render("index.slang")
        end
      end
      

      【讨论】:

      • 不应该是数组(公司)?
      • 这行不通。首先,@companies 应该在构造函数中初始化或者可以为 nillable。其次,Company.all 返回Jennifer::QueryBuilder::ModelQuery(Company),而不是Array(Company)。但感谢您解释这个概念。
      猜你喜欢
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多