在控制器上声明实例变量的类型

时间:2017-10-24 16:55:49

标签: crystal-lang amber-framework

我和Jennifer.cr在Amber框架上有一个水晶项目,我在我的控制器上收到了这个错误:

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

我如何解决这个问题&#34;简单&#34;问题

2 个答案:

答案 0 :(得分:9)

您不必在此处使用实例变量。局部变量是Amber应用程序默认使用的方式(并且可以在视图中访问):

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

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

答案 1 :(得分:2)

如前所述,使用局部变量是最优雅的解决方案。对于在此处收到类似错误消息但在不同背景下的人,请阅读以下内容:

第二条错误消息已指向正确的解决方案,以下代码也应该有效:

class CompanyController < ApplicationController
  @companies : Array(Company)?

  def index
    @companies = Company.all
    render("index.slang")
  end
end