【问题标题】:No route matches {:action=>"show", :controller=>"produits", :id=>nil} missing required keys: [:id]没有路线匹配 {:action=>"show", :controller=>"produits", :id=>nil} 缺少必需的键:[:id]
【发布时间】:2017-06-29 08:21:25
【问题描述】:

我有一个动作控制器 url 生成错误,内容如下:

class ProduitsController < ApplicationController
  before_action :set_cart, only: [:create, :destroy]
  before_action :set_cart_item, only: [:destroy]

  def index
    @produits = Produit.order(:nom).to_a
    @produits = Produit.all
    @categories = Categorie.all.order("categories.created_at DESC")
  end

  def show
    @produit  = Produit.find(params[:id])
  end

  def add_to_cart
    if session[:cart_id].blank?
     cart = Cart.create(status: 'pending')
     session[:cart_id] = cart.id
   else
     cart = Cart.find(session[:cart_id])
   end

   produit = Produit.find(params[:id])
   cart.cartships.create(produit_id: produit.id, quantite: 1)
   redirect_to cart
  end

end

这里是 index.html.erb

<div id="boutique-right">
    <div id="produits-column-container">
      <% if @produits %>
        <% @produits.in_groups_of(3, false).each do |group| %>
          <div id="produits-row-container">
            <% group.each do |produit| %>
            <div class="boutique-produit">
              <div>
                    <%= image_tag produit.photo %>
              </div>
              <div>
                <p><%= produit.nom %></p>
              </div>
              <div class="selection-action">
                <div>
                  <%= link_to 'Voir fiche produit', produit_path(@produit) %>
                </div>
                <div>
                  <%= number_to_currency(produit.prix, unit: '€', format: '%n%u') %>
                </div>
              </div>
              <div class="marche-quantite-increment-container">
                <!-- Increment/decrement method -->
                <div>—</div>
                <div>1</div>
                <div>+</div>
              </div>
              <div class="add-to-cart-home">
                <%= link_to 'Ajouter au panier' %>
              </div>
            </div>
            <% end %>
          </div>
        <% end %>
      <% end %>
    </div>
  </div>

然后,我收到以下错误消息:

ActionController::UrlGenerationError in Produits#index

No route matches {:action=>"show", :controller=>"produits", :id=>nil} missing required keys: [:id]

这里是 routes.rb:

Rails.application.routes.draw do

  match "/mon-panier" => 'carts#index', via: :get
  resources :carts

  resources :produits, only: [:index, :show]

  match "/presse" => 'presses#index', via: :get

  match "/partenaires" => 'partenaires#index', via: :get

  match "/mon-profil" => 'profils#show', via: :get

  match "/commandes-produits-breton" => 'commandes#index', via: :ge

  match "/paiements" => 'paiements#index', via: :get

  resources :categories

  resources :order_abonnements, only: [:create, :update, :delete]

  get 'livraisons_type/index'

  match "/recapitulatif" => 'recapitulatif#index', via: :get

  match "/confirmation-carte-cadeau" => 'recapitulatif#confirmation', via: :get

  match "/livraison-carte-cadeau" => 'livraison_carte#index', via: :get

  match '/activation-carte' => 'code_carte_cadeau#index', via: :get

  match "/offrir-une-box-bretonne" => 'cadeau#index', via: :get

  match "/nos-box" => 'nos_box#index', via: :get

  get 'categories/index'

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

  match '/informations-penn-ar-box' => 'informations_penn_ar_box#index', via: :get

  match '/livraison-box-bretonne' => 'livraison_box_bretonne#index', via: :get

  match '/abonnements' => 'abonnements#index', via: :get

  devise_for :users, path: '', path_names: { sign_in: 'connexion', sign_out: 'déconnexion'}

  resources :users do
    delete 'déconnexion' => 'devise/sessions#destroy'
    resources :profil
  end

  root 'home#home'
end

我也无法访问产品展示视图,因为 Rails 找不到任何具有 id= 的产品

【问题讨论】:

    标签: ruby-on-rails ruby routing


    【解决方案1】:

    您将@produit 传递给路径助手。你应该在哪里传递produit

    在index.html.erb 中更改这一行将解决问题

    <%= link_to 'Voir fiche produit', produit_path(@produit) %>
    

    到

    <%= link_to 'Voir fiche produit', produit_path(produit) %>
    

    【讨论】:

    • 详细说明:@produits 已设置,您正在执行:@produits.each do |produit| ...。另一方面,@produit 尚未设置为任何内容,因此是 nil - 因此出现错误消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多