1
resposta

Favoritar um objeto

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

1 resposta

Optei por ir por partes e não inserir a autenticação de usuário para não complicar mais a minha cabeça. Mas o model contém os relacionamentos.

User
has_many :favorite_buildings
FavoriteBuildings
belongs_to :user
belongs_to :building  #acredito que isso não esteja correto. Mas não estou certa!