2016-07-20 3 views
0

пытаюсь добавить маршруты в мое приложение rails, но каждый раз, когда я пытаюсь загрузить индексную страницу, он не возвращает никакого соответствия маршруту. мойнет путевых рельсов маршрута 5

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 %> 

, но когда-либо я загрузить страницу в моем broser я получить

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] 

что я делаю неправильно здесь, как я начинающий

ответ

1

Вы передаете продукт объект на месте категории_ид. Попробуйте это,

:category_id => product.category_id 
+0

это, как я должен добавить его? 'get '/ products /: category_id => product.category_id /: id /', to: 'products # show', as: 'product'' –

+0

Просто замените ваш <% = link_to продукт, класс:" card "do% > с этим <% = link_to product (categoty_id: product.category_id, id: product.id), class: "card" do%> –

+0

this breaks and bringa undefined method 'product 'for –

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

EDIT

Чтобы найти запись, используя имя, которое вы могли бы сделать что-то вроде этого в контроллере:

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

ну, я хочу что-то архивировать как/products/categoryname/produtcsname, я могу архивировать это, когда Я жестко указываю его в своем браузере 'http: //10.0.0.19: 3000/products/clothing/virgin-hair', но маршруты возвращаются как' http: //10.0.0.19: 3000/products/3? category_id = 2', когда его динамика на индексной странице –

+0

. Тогда вы не делаете это с помощью рельсов, это лучший способ обработки маршрутов, как я описал в ответе. (Плюс google любит эти пути, помогает вам лучше индексировать) Чтобы он искал имя, а не идентификатор, вы можете изменить свой код контроллера. (см. править) – siegy22

+0

этот рельс в качестве направляющей маршрута «get»/products /: category_id /: id/', to:' products # show ', as:' product_path'' Единственная проблема, с которой я столкнулся, состоит в том, чтобы сделать он работает во взглядах, так как я могу получить его в браузере –

Смежные вопросы