专柜类路由

时间:2016-04-24 05:00:08

标签: ruby-on-rails ruby

我在显示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

2 个答案:

答案 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个查询