2017-05-23 2 views
0

J'ai un site Web de commerce électronique avec des produits, des chariots et d'autres choses.Rails: le produit est réglé à zéro

Les deux variables @produit et @produits sont définies comme nulles mais je n'ai aucune idée pourquoi.

ici est produit.rb:

class Produit < ActiveRecord::Base 
    has_many :order_items 

    default_scope { where(active: true) } 

    mount_uploader :photo, PhotoUploader 

    validates :nom, presence: true 
    validates :artisan, presence: true 
    validates :quantite, presence: true 
    validates :categorie, presence: true 
    validates :denomination, presence: true 
    validates :description, presence: true 
    validates :prix, presence: true 
    validates :photo, presence: true 

end 

est ici le contrôleur:

class ProduitsController < ApplicationController 

    def index 
    @produits = Produit.all 
    @order_item = current_order.order_items.new(produit_params) 

    if @order_item.save 
     format.html { redirect_to @order_item, notice: 'Le produit a été ajouté au panier !' } 
     format.json { render json: @order_item, status: :created, location: @order_item } 
     format.js 
    else 
     format.html { render action: 'create', notice: 'Le produit n\'a pas été ajouté au panier' } 
     format.json { render @order_item.errors, status: unprocessable_entity } 
     format.js 
    end 
    end 

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

    private 

    def produit_params 
    params.require(:produit).permit(:nom, :quantite, :description, :denomination, :artisan, :categorie, :prix, :photo) 
    end 

end 

J'ai aussi ce point de vue en produits/index:

<%= render partial: 'layouts/navbarindex' %> 

<%= render partial: 'produits/header' %> 


<div id="path-progress-bar"> 
    <p>Accueil</p> 
    <p>/</p> 
    <p style="color:black">Boutique de produits breton</p> 
</div> 

<section id="marche-breton-container"> 

    <%= render template: 'categories/index' %> 

    <div id="produits-column-container"> 
    <% if @produits %> 
     <% @produits.in_groups_of(4, false).each do |g| %> 
     <% g.each do |produit| %> 
      <%= render partial: "produits/produit_row", produit: @produit, order_item: @order_item %> 
     <% end %> 
     <% end %> 
    <% end %> 
    </div> 

</section> 

et est ici le moteur de rendu _produit_row.html.erb :

<div id="produits-row-container"> 
    <div id="fiche-produit-container"> 
    <%= form_for order_item, remote: true do |f| %> 
     <div id="produit-img"> 
     <%= link_to produits_show_path do %> 
      <%= image_tag produit.photo %> 
     <% end %> 
     </div> 
     <div id="produit-nom"> 
     <%= produit.nom %> 
     </div> 
     <div id="produit-prix"> 
     <%= number_to_currency(produit.prix, unit: '€', format: "%n%u") %> 
     </div> 
     <div id="produit-au-panier"> 
     <%= image_tag('icon/icon-panier') %> 
     <%= f.submit 'Ajouter au panier' %> 
     </div> 
    <% end %> 
    </div> 
</div> 

Le problème est que @produit et @produits sont mis à zéro, de sorte que la vue ne montre rien, même si j'ai une séance d'active_admin où les produits sont mis en place.

MISE À JOUR: le logs:

Started GET "/mon-marche-breton" for ::1 at 2017-05-24 09:17:47 +0200 
Processing by MarcheBretonController#index as HTML 
    User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1 
    Rendered layouts/_cart_text.html.erb (6.9ms) 
    Rendered layouts/_navbarindex.html.erb (26.4ms) 
    Rendered produits/_header.html.erb (3.4ms) 
    Categorie Load (0.3ms) SELECT `categories`.* FROM `categories` 
    Rendered categories/index.html.erb (5.5ms) 
    Rendered produits/index.html.erb (39.2ms) 
    Rendered marche_breton/index.html.erb within layouts/application (40.3ms) 
    Rendered layouts/_footer.html.erb (3.2ms) 
Completed 200 OK in 253ms (Views: 242.1ms | ActiveRecord: 3.6ms) 


Started GET "/assets/bg/bg-banner.png" for ::1 at 2017-05-24 09:17:48 +0200 


Started GET "/assets/bg/footer.png" for ::1 at 2017-05-24 09:17:48 +0200 


Started GET "/assets/bg/before-footer.png" for ::1 at 2017-05-24 09:17:48 +0200 
+0

Avez-vous vérifié dans la console rails que 'Produit.all' obtient des données. En outre, les produits que vous avez stockés ont l'attribut 'active: true'? souvenez-vous du 'default_scope {où (active: true)}'. –

+2

'Produits # index' ne devrait pas recevoir de paramètres pour' OrderItem'. Ce devrait être une requête GET. Envisager de conditionner le @ order_item.save à un contrôleur 'OrderItems' (probablement dans une action' create'). – coreyward

+0

@AlejandroMontilla Oui, j'ai vérifié la console des rails et 'Produit.all' récupère les données que j'ai saisies dans ma session active_admin. C'est pourquoi je ne comprends pas ... – justinedps26

Répondre

0

Le problème est ici:

<% @produits.in_groups_of(4, false).each do |g| %> 
     <% g.each do |produit| %> 
      <%= render partial: "produits/produit_row", produit: @produit, order_item: @order_item %> 

Vous itérer sur la collection @produits et attribuer à chaque instance unique de la collection à produit. Par conséquent, lorsque vous passez le produit: @produit partielle, vous passez effectivement nil.

Pour résoudre ce problème, il suffit de supprimer le @ et de l'avoir correctement délimité! :)

<% @produits.in_groups_of(4, false).each do |g| %> 
     <% g.each do |produit| %> 
      <%= render partial: "produits/produit_row", produit: produit, order_item: @order_item %> 

En outre, je suppose que produits_show_path dans votre partie ne fonctionnera pas comme ça. Vous voudrez peut-être l'avoir comme ceci:

link_to produit_path(produit) do 

J'espère que cela aide!

+0

la chose est,' @ produits' est également nul. J'ai essayé de faire ce que vous venez de suggérer et cela ne fonctionne pas ... – justinedps26

+0

Oh, d'accord. Tout d'abord, assurez-vous que vous avez définitivement Produit dans votre base de données. En outre, supprimez la partie 'if @ order_item.save' de votre méthode d'index (supprimez également l'autre cas) afin de vous assurer que le rendu de l'index est correct. Je suppose qu'en raison de ce conditionnel, il ne rend pas réellement votre vue souhaitée. –

+0

'Produit' est dans la base de données. J'ai enlevé l'instruction 'if @ order_item.save' (aussi le cas' else') et rien ne change. Je vais mettre à jour la question avec les journaux pour vous permettre de voir ce qui se passe – justinedps26