ActionView::Template::Ошибка (маршрут не совпадает {: действие => «показать», : контроллер =>»категории», : id => nil} отсутствуют обязательные ключи: [:id]):

#ruby-on-rails #ruby #routes #vps

#ruby-on-rails #ruby #маршруты #vps

Вопрос:

Я знаю, что здесь много сообщений о подобных проблемах, но ни один из них мне не помогает.

Мое приложение отлично работает localhost после его развертывания с использованием Capistrano/passenger to production mode на VPS, я получаю эту ошибку. Я ничего не изменил в коде, контроллерах или маршрутах… итак, я понятия не имею, почему я получаю эту ошибку.

Кто-нибудь может мне помочь с этим???

** РЕДАКТИРОВАТЬ **

Возможно ли, что эта ошибка возникает из-за того, что я destroyed категории с идентификатором 1-8 на VPS .

Если я войду в rails console систему, это элементы в category

  Category Load (0.6ms)  SELECT "categories".* FROM "categories"
 => #<ActiveRecord::Relation [#<Category id: 9, name: "Beauty amp; Fragrance",  created_at: "2016-09-30 10:43:54", updated_at: "2016-10-04 16:35:41">, # <Category id: 10, name: "Jewellery", created_at: "2016-10-04 16:36:40",  updated_at: "2016-10-04 16:36:40">, #<Category id: 11, name: "Home Decor",  created_at: "2016-10-04 16:37:13", updated_at: "2016-10-04 16:37:13">, # <Category id: 12, name: "Giftwrap and Cards", created_at: "2016-10-04 16:37:42",  updated_at: "2016-10-04 16:37:42">]>
  

Возможно ли, что код в индексе ищет элемент категории с идентификатором от 1 до ….?

** Обновить **

когда я запускаю Product.where(category_id: [*1..8]) , я получаю Product Load (0.9ms) SELECT "products".* FROM "products" WHERE "products"."category_id" IN (1, 2, 3, 4, 5, 6, 7, 8) => #<ActiveRecord::Relation []>

Так что, скорее всего, эта ошибка не отображается

это из production.log

 ActionView::Template::Error (No route matches {:action=>"show", :controller=>"categories", :id=>nil} missing required keys: [:id]):
23:                                         <% if index == 0 %>
24:                                         <div class="col-lg-4 col-sm-6 col-xs-12 center-block " >
25:                                 
26:                                                 <%= link_to category_path (category) do %>
27:                                                         <%= image_tag product.image.url(:medium), class: "img-responsive" %>
28:                                                 <% end %>
29:                                 <div class="caption">
app/views/pages/index.html.erb:26:in `block (3 levels) in _app_views_pages_index_html_erb___619502042981659248_47242510413860'
app/views/pages/index.html.erb:22:in `each'
app/views/pages/index.html.erb:22:in `each_with_index'
app/views/pages/index.html.erb:22:in `block (2 levels) in _app_views_pages_index_html_erb___619502042981659248_47242510413860'
app/views/pages/index.html.erb:20:in `each'
app/views/pages/index.html.erb:20:in `block in _app_views_pages_index_html_erb___619502042981659248_47242510413860'
app/views/pages/index.html.erb:18:in `each'
app/views/pages/index.html.erb:18:in `each_slice'
app/views/pages/index.html.erb:18:in `_app_views_pages_index_html_erb___619502042981659248_47242510413860'
  

Вот метод индексации из `pages_controller.rb

  def index
   @products = Product.all.order(created_at: :desc).group_by(amp;:category_id)
    @images  = ["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg", "7.jpg", "8.jpg", "9.jpg", "10.jpg"]
    @random_no = rand(10)
    @random_image = @images[@random_no]
end
  

Вот categories_controller.rb

 class CategoriesController < ApplicationController
  before_action :set_category, only: [:show, :edit, :update, :destroy]
def index
  @categories = Category.all
end

def show
   @products = @category.products
   @images  = ["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg"]
   @random_no = rand(5)
   @random_image = @images[@random_no]
end

private
  def set_category
    @category = Category.includes(:products).find(params[:id])
  end

  def category_params
    params.require(:category).permit(:name)
  end

end
  

Вот pages/index.html.erb

 <div class="container-fluid">


    <% @products.each_slice(3) do |products_group| %>
    <div class="row">
      <% products_group.each do |category, products| %>

            <% products.each_with_index do |product, index| %>
                <% if index == 0 %>
                    <div class="col-lg-4 col-sm-6 col-xs-12 center-block " >

                    <%= link_to category_path (category) do %>
                        <%= image_tag product.image.url(:medium), class: "img-responsive" %>
                    <% end %>
            <div class="caption">
                <p class="category-name" ><%= product.category.name %></p>
             </div> 
            <% end %>
            <% end %>
            </div> 
        <% end %>
        </div>
    <% end %>

 </div>
  

и вот config/routes.rb

 Rails.application.routes.draw do

 get 'products/search' => 'products#search', as: 'search_products'
 post 'emaillist/subscribe' => 'emaillist#subscribe'
 resources :categories
 resources :labels
 resources :products do
   resources :product_items
 end

 resources :carts 

 resources :orders

 devise_for :admin_users, ActiveAdmin::Devise.config
 ActiveAdmin.routes(self)

 resources :contacts, only: [:new, :create]

  root 'pages#index'


 get 'about' => 'pages#about'

 get 'location' => 'pages#location'

 get  'help' => 'pages#help'

end
  

вот category часть маршрутов рейка

      categories GET        /categories(.:format)                                   categories#index
                           POST       /categories(.:format)                                   categories#create
              new_category GET        /categories/new(.:format)                              categories#new
             edit_category GET        /categories/:id/edit(.:format)                         categories#edit
                  category GET        /categories/:id(.:format)                              categories#show
                           PATCH      /categories/:id(.:format)                              categories#update
                           PUT        /categories/:id(.:format)                              categories#update
                           DELETE     /categories/:id(.:format)                              categories#destroy
  

Как я уже говорил, это отлично работает на локальном хостинге, и я совершенно не понимаю, почему это не работает так же на VPS

Комментарии:

1. Вы перенесли базу данных?

2. Да, это произошло автоматически при развертывании с помощью Capistrano

3. я думаю <%= link_to category_path (category) do %> , должно быть <%= link_to category_path (category.id) do %>

4. хорошо, @SantoshSharma Я попробовал это на localhost , но там выдает ошибку, как вы думаете, это сработает на VPS?

5. Потому что вы уничтожили категории. На вашей консоли VPS посмотрите, есть ли у вас какие-либо устаревшие продукты, у которых нет соответствующих категорий. Если это так, вам нужно их очистить. Product.where(category_id: [*1..8]) покажет их.

Ответ №1:

По-прежнему похоже, что у вас есть объекты продукта с идентификатором category_id, но, возможно, этот объект категории исчез.

Я бы исключил это, найдя продукт с нулевой категорией. Определенно есть более элегантный способ написать это, но, похоже, у вас сейчас не слишком много объектов в вашей базе данных, так что это может сработать:

В вашей консоли VCS:

 Product.all.map { |p| {p.id => p.category} }
  

Это покажет вам идентификатор продукта, если таковой имеется, и указывает ли он на категорию или на ноль.

Комментарии:

1. Спасибо за этот отличный ответ, он мне действительно помог. Был один продукт без категории, который привел к сбою приложения..