8

I have a crystal-lang project on Amber framework with Jennifer.cr and I'm getting this error on my controller:

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

The controller is:

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

When I try to solve the problem this way:

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

I got another error:

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

How can I solve this "easy" problem?

Weston Ganger
  • 6,324
  • 4
  • 41
  • 39
Osmond
  • 345
  • 4
  • 9

2 Answers2

9

You don't have to use instance variable here. Local variable is a way Amber app uses by default (and they are accessible in views):

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

But if you want to use an instance variable due to some reason, you need to declare and initialize it at a class level or follow other type inference rules.

Vitalii Elenhaupt
  • 7,146
  • 3
  • 27
  • 43
2

As mentioned using a local variable here is the most elegant solution. For people ending up here with a similar error message but in a different context, read below:

The second error message already points to the right solution, the following code should work too:

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

  def index
    @companies = Company.all
    render("index.slang")
  end
end
Jonne Haß
  • 4,792
  • 18
  • 30