Project.print_it
is calling print_it on the class Project. But, you define print_it as an instance method, not a class method, here:
class Project < ApplicationRecord
def print_it
self.as_json
end
end
You probably want something more like:
class Api::V1::ProjectsController < Api::ApiController
def index
render json: @project.print_it
end
end
Naturally, you'll need to set @project.
To use print_it on an ActiveRecord_Relation called @projects, you could do something like:
@projects.map{|p| p.print_it}
You'll end up with an array.
But that might be expensive, depending on the number of projects and the nature of print_it.
How can I use print_it on an object?
You are 'using' (calling) print_it on an object. Project is an object. Just like @project is an object. You just happen to be calling print_it on an object that doesn't have print_it defined (thus the undefined method error).
I will also note that Jörg W Mittag wishes to say:
I am one of those Ruby Purists who likes to point out that there is no such thing as a class method in Ruby. I am perfectly fine, though, with using the term class method colloquially, as long as it is fully understood by all parties that it is a colloquial usage. In other words, if you know that there is no such thing as a class method and that the term "class method" is just short for "instance method of the singleton class of an object that is an instance of Class", then there is no problem. But otherwise, I have only seen it obstruct understanding.
Let it be fully understood by all parties that the term class method is used above in its colloquial sense.