2012-12-20 86 views
4

我有一個大致呈現一個集這樣的頁面:傳遞一個局部變量到嵌套部分

index.html.haml

= render partial: 'cars_list', as: :this_car, collection: @cars 

_cars_list.html.haml

編輯: _cars_list有關於單車的其他信息。

%h3 Look at these Cars! 
%ul 
    %li Something about this car 
    %li car.description 
%div 
    = render partial: 'calendars/calendar_stuff', locals: {car: this_car} 

_calendar_stuff.html.haml

- if car.date == @date 
    %div 
    = car.date 

_cars_contoller.rb

def index 
    @cars = Car.all 
    @date = params[:date] ? Date.parse(params[:date]) : Date.today 
end 

局部日曆的東西會發生什麼事是,this_car總是在汽車集合,即第一輛車同一日期會被反覆打印。

如果我將_calendar_stuff中的邏輯移動到cars_list部分,則打印結果會按預期更改。

因此,Rails在每次呈現部分內容時都沒有將當地的對象this_car傳遞到嵌套的部分中。

有誰知道爲什麼?

P.S.如果我的代碼結構爲

@cars.each do |car| 
    render 'cars_list', locals: {this_car: car} 
end 

我得到相同的行爲。

回答

-1

試試這個重構,看看你得到你想要的輸出:

index.html.haml

= render 'cars_list', collection: @cars, date: @date 

擺脫partial關鍵字,並通過在@date實例變量作爲局部變量將邏輯封裝在您的部分中。這一點我從Rails Best Practices得到。

_cars_list.html.haml

%h3 Look at these Cars! 
%ul 
    %li Something about this car 
%div 
    = render 'calendars/calendar_stuff', car: car, date: date 

正如你在@cars通過爲collection,這部分將不得不叫car一個單一化的局部變量,然後可以傳遞到下一個參考部分,以及現在的局部date變量。由於呈現的部分位於與此處不同的位置(在calendars/之下),因此在此明確需要關鍵字partial

_calendar_stuff.html。HAML

- if car.date == date 
    %div 
    = car.date 

編輯

建議調用collection移動到_cars_list.html.haml,但這是不適合的問題。

編輯2

這是上面的代碼的版本,如果你還是想指定本地變量爲this_car,所以你會是壓倒一切的是collection會自動生成car局部變量。

index.html.haml

= render 'cars_list', collection: @cars, as: :this_car, date: @date 

_cars_list.html.haml

%h3 Look at these Cars! 
%ul 
    %li Something about this car 
    %li this_car.description 
%div 
    = render 'calendars/calendar_stuff', this_car: this_car, date: date 

_calendar_stuff.html.haml

- if this_car.date == date 
    %div 
    = this_car.date 
+0

試了一下,BU t仍然具有相同的行爲。幾件事情:1)'index.html.haml'文件中'partial:'是必須的,因爲我也使用了collection:參數。我相信你只能用'= render'cars_list''這樣的東西來放棄它。 2)單車局部變量車在'cars_list.html.haml'文件中效果很好,但是當我將它傳遞給'_calendar_stuff'時,它總是傳入集合中的第一個'car',而不是迭代器中的當前車。 – bknoles

+0

我之前使用過沒有'partial'關鍵字的'collection',但是如果你發現問題出現,如果你不發表它,通過一切手段繼續使用它。 –

+0

看看我對我的答案所做的修改是否適合你。 –