我在显示Shoppe类别时遇到了一些问题。我希望在索引页面上显示类别名称和图像,类别名称充当类别页面的链接,其中显示此类别的产品。我在视图中有以下代码:
<% @products.each do |category, products| %>
<%= link_to category.name, product_category_path %>
<% end %>
但它返回错误undefined local variable or method 'product_category_path' for #<#<Class:0xb22076fc>:0xb2205870>
我应该为类别和产品制作控制器吗?因为现在我只有products_controller.rb
代码如下:
class ProductsController < ApplicationController
def index
@products = Shoppe::Product.root.ordered.includes(:product_categories, :variants)
@products = @products.group_by(&:product_category)
end
def show
@product = Shoppe::Product.root.find_by_permalink(params[:permalink])
end
end
答案 0 :(得分:0)
我不清楚你想在这里实现什么,但错误信息非常明确。如果您运行rake routes
,则无法找到名为product_category_path
你需要把
resources :products do
resources :categories
end
在routes.rb
文件中,您需要创建CategoriesController
show
行动
我感到困惑的原因是
<%= link_to category.name, product_category_path %>
product_category_path
表示你想要一个这样的网址
/products/:product_id/categories/:id(.:format)
您必须使用product_category_path(product, category)
但它确实符合您想要做的描述。您真正想要的可能只是简单的category_path
,在这种情况下,您可以访问类别页面,其中所有产品都属于此类
/categories/:id(.:format)
并且您可以查看,
<%= link_to category.name, category_path(category) %>
您仍需要使用CategoriesController
创建action
,但不会要求product_id
控制器代码可能如下所示(假设您正确设置了关联)
class CategoriesController < ApplicationController
def show
@category = Category.includes(:products).find(params[:id])
end
end
答案 1 :(得分:0)
我认为 railsy 的方式是:
1)创建CategoriesController
2)使用会员路线
在您的路线中:
resources :categories do
member do
get :products
end
end
您的助手将为products_category_path(@category)
,网址为/categories/:id/products
。
会员路线会向您的控制器添加自定义操作products
。
您的索引视图会包含:
<% @products.each do |product| %>
<%= link_to product.category.name, products_category_path(product.category) %>
<% end %>
在CategoriesController
中你会得到:
def products
Shoppe::Product.where(category_id: params[:id])
end
N.B。包括产品&#39;产品中的类别索引操作以避免N + 1个查询