为什么我得到 NoMethodError?
why do i get NoMethodError?
我希望我的交易页面显示用户已添加到购物车的每个 Item
的列表,但我无法理解为什么此实现会给我一个 NoMethodError
因此,在我的 TradesController 的 #show
操作中,我有一个 trade_ids
变量,其中包含由 $redis.smembers current_user_trade
返回的添加项数组。然后我使用它来查找每个项目的 id,并在我的视图中循环遍历实例变量。
我的交易控制器:
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
这是我用来向 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
我的路线:
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
然后在我的交易视图中,我有一个基本的:
<% @trade_items.each do |item| %>
<p><%= item.title %></p>
etc
<% end %>
我最初的想法是,这与我一直使用 FriendlyId 生成 slug 的事实有关。但是根据 FriendlyId's doc,将 :finders
添加到我的 Item 模型中的 slug 声明应该可以重新启用按 id 查找。但事实并非如此。
我也尝试重构它,以便它使用我的 Items :slug,但这也无济于事。
已修复。原来它被缓存了。我中途从存储 item_id
切换到 item_slug
,需要 运行 redis-cli flushall
才能存储和访问正确的数据。
我希望我的交易页面显示用户已添加到购物车的每个 Item
的列表,但我无法理解为什么此实现会给我一个 NoMethodError
因此,在我的 TradesController 的 #show
操作中,我有一个 trade_ids
变量,其中包含由 $redis.smembers current_user_trade
返回的添加项数组。然后我使用它来查找每个项目的 id,并在我的视图中循环遍历实例变量。
我的交易控制器:
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
这是我用来向 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
我的路线:
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
然后在我的交易视图中,我有一个基本的:
<% @trade_items.each do |item| %>
<p><%= item.title %></p>
etc
<% end %>
我最初的想法是,这与我一直使用 FriendlyId 生成 slug 的事实有关。但是根据 FriendlyId's doc,将 :finders
添加到我的 Item 模型中的 slug 声明应该可以重新启用按 id 查找。但事实并非如此。
我也尝试重构它,以便它使用我的 Items :slug,但这也无济于事。
已修复。原来它被缓存了。我中途从存储 item_id
切换到 item_slug
,需要 运行 redis-cli flushall
才能存储和访问正确的数据。