没有路线匹配铁路5

时间:2016-07-20 12:11:19

标签: ruby-on-rails ruby ruby-on-rails-5

我正在尝试将路由添加到我的rails应用程序,但每次我尝试加载索引页面时都不返回路由匹配。 我的

product.rb

belongs_to :category
extend FriendlyId
friendly_id :name, use: [:slugged, :finders]
 default_scope { where(active: true) }
end

这是我的category.rb

has_many :products
  extend FriendlyId
 friendly_id :name, use: [:slugged, :finders]

我的路线设置如下

    resources :categories
    get '/products/:category_id/:id/', to: 'products#show', as: 'product'
    resources :products

在我的索引页面中,我喜欢这个

<%= link_to product, class: "card" do %>
<div class="product-image">
<%= image_tag product.productpic.url if product.productpic? %>
    </div>

      <div class="product-text">
        <h2 class="product-title"> <%= product.name %></h2>
          <h3 class="product-price">£<%= product.price %></h3>
      </div>

        <% end %>
    <% end %>

但是当我加载页面时,我得到了

No route matches {:action=>"show", :category_id=>#<Product id: 4, name: "virgin hair", price: #<BigDecimal:7fd0af3ffb10,'0.3E3',9(18)>, created_at: "2016-07-19 12:34:34", updated_at: "2016-07-19 12:41:36", slug: "virgin-hair", productpic: "longhair.jpg", pdescription: "this a brazilian virgin hair", active: true, category_id: 2>, :controller=>"products"} missing required keys: [:id]

我在这里做错了什么,因为我是新手

2 个答案:

答案 0 :(得分:1)

您正在传递产品对象来代替category_id。 试试这个,

 :category_id => product.category_id

答案 1 :(得分:0)

您尝试做的事情称为nested routing

这就是你如何做对的:

# config/routes.rb
resources :categories do
  resources :products
end

在您的控制器中:

# app/controllers/products_controller.rb
...
  def show
    @category = Category.find(params[:category_id])
    @product = @category.products.find(params[:id])
  end
...

并在您的视图中(链接上述控制器操作):

<%= link_to 'Awesome Product!', category_product_path(@category, @product) %>

定义上述路线可以让您制作如下路径:

/categories/123/products/1

修改

要使用名称查找记录,您可以在控制器中执行以下操作:

# app/controllers/products_controller.rb
...
  def show
    @category = Category.find_by!(name: params[:category_id])
    @product = @category.products.find_by!(name: params[:id])
  end
...