Search code examples
ruby-on-railsredisfriendly-id

why do i get NoMethodError?


I want my trade page to show a list of every Item that a user has added to their cart, and I'm having trouble understanding why this implementation is giving me a NoMethodError

So in the #show action of my TradesController I have a trade_ids variable that contains an array of added items returned by $redis.smembers current_user_trade. I then use this to perform a lookup on the id of each item, and loop through the instance variable in my view.

My Trades Controller:

class TradesController < ApplicationController
 def show
  trade_ids = $redis.smembers current_user_trade
  @trade_items = Item.find(trade_ids)
 end

 def add
  $redis.sadd current_user_trade, params[:item_id]
  render json: current_user.trade_count, status: 200
 end

 def remove
  $redis.srem current_user_trade, params[:item_id]
  render json: current_user.trade_count, status: 200
 end


 private

 def current_user_trade
  "trade#{current_user.id}"
 end
end

Here's the method I'm using to add items to current_user_trade:

class Item < ActiveRecord::Base

 extend FriendlyId
 friendly_id :slug, use: [:slugged, :finders]

 def slug
  [artist.parameterize, title.parameterize].join("-")
 end

 def trade_action(current_user_id)
  if $redis.sismember "trade#{current_user_id}", id
   "Remove from"
  else
   "Add to"
  end
 end
end

My routes:

resource :trade, only: [:show] do
 put 'add/:item_id', to: 'trades#add', as: :add_to
 put 'remove/:item_id', to: 'trades#remove', as: :remove_from
end

And then in my trades view I've got a basic:

<% @trade_items.each do |item| %>
 <p><%= item.title %></p>
 etc
<% end %>

My initial thought is that this had something to do with the fact that I've been using FriendlyId for slug generation. But according to FriendlyId's doc, adding :finders to the slug declaration in my Item model should reenable lookups by id. But it's not.

I also tried refactoring this so that it used my Items :slug, but that too was to no avail.


Solution

  • Fixed it. Turns out it was cached. I switched from storing item_id to item_slug halfway through, and needed to run redis-cli flushall to get it to store and access the right data.