2016-03-27 9 views
0

Ein Anfänger hier, also, bitte ertragen Sie mit mir. :)Teilweise gerendert in index.html.erb Wird nicht in show.html.erb angezeigt

Ich habe eine teilweise in einem Teil das ist richtig in meinem views > products > index.html.erb Anzeige:

<div> 
<table> 
    ... 
    <tbody> 
    <%= render product %> 
    </tbody> 
    ... 
</table> 
</div> 

Dies ist der _product Teil ist:

<div> 
<td> 
    <%= render "product_row", product: product, order_item: @order_item %> 
</td> 
</div> 

..welche Punkte auf diese _product_row Teil:

<div> 
    <%= form_for order_item, remote: true do |f| %> 
    <%= number_to_currency product.price %> 
    <%= f.number_field :quantity, value: 1, class: "form-control", min: 1 %> 
    <%= f.hidden_field :product_id, value: product.id %> 
    <%= f.submit %> 
    <% end %> 
</div> 

Alles ist gut, ABER ich Ich möchte stattdessen _product_row in meinem views > products > show.html.erb anzeigen. Also, ich kopieren und fügen Sie ihn und diese Fehlermeldung erhalten:

NameError in Products#show 
undefined local variable or method `product' for #<#<Class:...> 
Extracted source: 
<%= render "product_row", product: product, order_item: @order_item %> 

... so gehe ich in meinem products_controller und setzen diese:

def show 
@product = Product.find(params[:id]) 
    respond_to do |format| 
    format.html # show.html.erb 
    format.json { render json: @product } 
    end 
end 

‚immer noch die gleichen Fehler.

Jede Hilfe wird geschätzt.

Danke!

Antwort

1

Du Rendern teilweise aus index.html.erb Datei wie:

<%= render product %> 

hier wird product Variable nicht als lokale Variable in der View-Datei definiert. Geben Sie die Produktvariable von der Indexaktion Ihres Controllers als Instanzvariable wie @product weiter oder definieren Sie sie auf der Seite index.html.

Oder Sie tun einfach so: in products_controller> index

def index 
    @products = Product.all 
end 

in Produkte> index.html.erb

<% @products.each do |product| %> 
<div> 
<table> 
    ... 
    <tbody> 
    <%= render product %> 
    </tbody> 
    ... 
</table> 
</div> 
<% end %> 
+0

mit diesem Rennen, ging ich in meinem 'products_controller' und setzen diese: ' def Index @product = Product.find (params [: id]) end' und immer noch die gleichen Fehler. :( –

+0

Wenn Sie mit dem traditionellen Routing-Routing gehen, dann akzeptiert der 'products_controller> index' keinen ** id ** -Parameter. Wenn Sie dies also tun möchten, müssen Sie die Indexmethodenroute anpassen. – Emu

+0

Okay, modifiziere 'methods> product.rb' mit einer Regel für' index'. 'Werde das später versuchen. Danke! :) –

1

Ich vermute, Sie haben wahrscheinlich einige Schleife wie folgt in Ihrem index.html.erb

<% @posts.each do |post| %> 
    <%= render product %> 
<% end %> 

Hier bezieht sich product im Aufruf render auf die lokale Variable, die Sie im Block des Iterators definiert haben.

Wenn Sie jedoch versuchen, den gleichen Code in Ihre show.html.erb zu kopieren, wird product als nicht definiert betrachtet, da er außerhalb der Schleife liegt.

So sollten Sie folgendes verwenden:

<%= render @product %> 

in Ihrem show.html.erb, vorausgesetzt, Sie @product in Ihrer show Aktion zugewiesen haben müssen.

+0

Alter, genau so sieht meine 'index.html.erb' aus! Und '<% = render @product%>' hat in meiner 'show.html.erb' funktioniert! Vielen Dank! Ihr seid fantastisch! –

0

@Emu und @Dharam schlug vor, dass ich

statt <%= render product %>

in meinem Artikel stellen show.html.erb und sicher @product machen in meinem products_controller.rb definiert, was ich auch tat:

def show @product = Product.find(params[:id]) end

Es hat funktioniert! Keine undefined Fehler mehr.

Ich hatte jedoch ein paar Styling-Probleme mit diesem. Lange Geschichte-kurz, ich kopierte und klebte, was in meinem _product_row Teil (siehe Original-Code in der obigen Frage) in mein Produkt show war, anstatt es zu rendern. Dann habe ich es ein wenig modifiziert, basierend auf Emus und Dharams Vorschlag. Grundsätzlich gepflanzt es die Idee, zu versuchen @ s hinzuzufügen, wo es Fehler aus als undefiniert:

<div> 
<%= form_for @order_item, remote: true do |f| %> 
    <h4 style="font-family: 'Share Tech Mono', sans-serif;">The Small Price to Pay: 
    <span style="color: green"> 
    <%= number_to_currency @product.price %> 
    </span> 
    </h4> 
    <h4 style="font-family: 'Share Tech Mono', sans-serif;">How many:</h4> 
    <div class="input-group"> 
    <%= f.number_field :quantity, value: 1, class: "form-control", min: 1 %> 
    <div class="input-group-btn, add-to-cart-button"> 
    <%= f.hidden_field :product_id, value: @product.id %> 
    <%= f.submit "ADD IT", class: "btn btn-danger" %> 
    </div> 
    </div> 
<% end %> 
</div> 

Dann ist dieser hinzugefügt meine products_controller.rb:

def show @product = Product.find(params[:id]) @order_item = current_order.order_items.new end

Ich hoffe, das macht Sinn. Nochmals vielen Dank. :)