Olá, pessoal. Estou fazendo um projeto individual onde o meu objetivo é consumir uma API e favoritar objetos dessa API. Pra essa funcionalidade, Criei um model e um controller chamados FavoriteBuilding e uma tabela que possui 2 chaves estrangeiras: user_id e building_id.
Acredito que devo ter errado nesse ponto pois não existe uma tabela building para que eu possa pegar a chave primária. Existe apenas um model onde utilizo a gem FARADAY para consumir a API. Quando clico para favoritar um item recebo o seguinte erro:
NoMethodError (undefined method `arel_table' for Building:Class):
app/controllers/favorite_buildings_controller.rb:5:in `update'
Assim está o model Building:
API_URL = Rails.configuration.apis[:orulo_buildings_api]
attr_reader :id, :name, :description
def initialize(args)
@id = args[:id]
@name = args[:name]
@description = args[:description]
end
def self.find(id)
conn = Faraday.new(
url: API_URL,
headers: { "Authorization" => "token here" }
)
response = conn.get
building = JSON.parse(response.body, symbolize_names: true)
new(id: :id, name: building[:name], description: building[:description])
end
FavoriteBuildingsController:
def update
favorite = FavoriteBuilding.where(building: Building.find(params[:building]))
if favorite == []
FavoriteBuilding.create(building: Building.find(params[:building]))
@favorite_building = true
else
favorite.destroy_all
@favorite_building = false
end
respond_to do |format|
format.html {}
format.js {}
end
end
O template do update:
$ ('#favorite_building_link').text("<%= favorite_text %>");
BuildingsController:
def index
@buildings = Building.all
@favorite_building = FavoriteBuilding.where(building: Building.find(params[:id])) == [] ? false : true
end
OBS: Assisti alguns tutoriais e optei por nÃo utilizar gems para entender melhor o mecanismo mas confesso que nÃo compreendi a linha 2 do método index e nÃo sei se estou chamando o parâmetro correto.
Index View:
<% @buildings.each do |building| %>
<h4><%= building.name %></h4>
<%= building.description%>
<%= link_to favorite_text, favorite_building_path(building), method: :patch, id: 'favorite_building_link',
remote: :true %>
Criei um helper no application_controller
def favorite_text
return @favorite_building? "UnFavorite" : "Favorite"
end
helper_method :favorite_text
Alguém poderia me dar uma luz? Sei que não está no contexto do curso do rails e é um pouco mais avançado mas não consegui encontrar uma solução por conta própria. Recomendariam utilizar uma gem? Acredito que existem formas mais simples de se fazer isso. Esse código me parece mais complexo do que deveria ser de fato. Obrigada desde já <3