Za duzo iteracji w petli for

Przy wyswietlaniu komentarzy petla for iteruje o jeden raz za duzo. customer.comments.count zwraca w tym przypadku 3 czyli poprawna ilosc komentarzy.

Uploaded with ImageShack.us

customers/show

[code=ruby]


<%= @customer.name %>

<%= @customer.age %>

<% for comment in @customer.comments %>
<%= comment.body %>
<%= comment.id %>
<%= @id+=1 %>:

<%end%>

Dodaj Komentarz:
<%= render :partial => 'comments/new' %>

[/code] customers_controller:

def show @customer = Customer.find(params[:id]) @comment = @customer.comments.build @id = 0 end
Drugi problem

Czy jest jakas mozliwosc ustawienia zmiennej w podszablonach. Pole do dodawania komentarzy jest podszablonem przez co musialem skopiowac do customers_controller
@comment = @customer.comments.build bo inaczej dostaje blad

customers_controller:

def show @customer = Customer.find(params[:id]) @comment = @customer.comments.build @id = 0 end
comments_controller:

[code=ruby] def new
@customer = Customer.find(params[:customer_id])
@comment = @customer.comments.build
end

def create
@customer = Customer.find(params[:customer_id])
@comment = @customer.comments.build(params[:comment])
if @comment.save
redirect_to customer_path(@customer)
end
end[/code]

[quote=lewy313]<% for comment in @customer.comments %>
<%= comment.body %>
<%= comment.id %>
<%= @id+=1 %>:

<%end%>[/quote]
Tutaj możesz użyć each albo each_with_index jeśli potrzebujesz numeracji np.

@customer.comments.each_with_index do |comment, index|

możesz przekazać zmienną do partiala (ładniej brzmi niż podszablon :slight_smile: ) <%= render :partial => ‘comments/new’, :locals => {:foo => bar} %>

Pierwszy problem:
Dostajesz dodatkową iterację bo zrobiłeś

@comment = @customer.comments.build

Czyli Twój @customer ma 4 komentarze, przy czym tylko 3 z nich są zapisane w bazie.

Drugi problem:
a) comments/new jest zazwyczaj używane do akcji new w kontrolerze, może lepiej byłoby nazwać partial form albo comment_form?
b) Jeżeli w comments/new masz jakiś form_for, to możesz zrobić

form_for @customer.comments.build do |f| ... end
co rozwiąże Ci również pierwszy problem, bo nie będziesz potrzebował wymienionej w problemie 1 linijki kodu.

Dzieki :slight_smile:

[code=ruby] <% @customer.comments.each_with_index do |comment, index| %>

<%= index %> <%= comment.body %>

<%end%>[/code] [url=http://img686.imageshack.us/i/iteracja.png/][img]/uploads/default/1694/1ee3dec32613a9f9.jpg[/img][/url]

Uploaded with ImageShack.us

Dlaczego caly czas iteruje o raz za duzo :confused:

@t = Customer.find(112)
@t.comments.count -> 3
@t.comments[3] -> nil

Moze powoduje to .build w kontrolerze

@comment = @customer.comments.build

lol to pewnie sie wyswietla pusty obiekt klasy

Rozwiazanie:

Usunac @customer.comments.build z customers_controller i zmienic render na

<%= render :partial => ‘comments/new’, :locals =>{:comment => @customer.comments.build} %>

ps: Dzieki squil nie zauwazylem twojego posta po edytowaniu swojego :slight_smile: