2012-12-23 49 views
5

有兩種方法可以做到這一點。Sinatra將變量傳遞給erb

首先是使用:locals => {....}和其他是使用@var_name。我只是想知道哪一個更好/更喜歡?我無法在任何地方找到答案。

感謝

回答

7

我沒有經驗,但可能你寫的使用@var_name更少的代碼,但如果讓我們說你有2個動作,其渲染不同的對象相同的觀點,讓我們說,一個以foo和其他與酒吧,你可能會想使用當地人。

def foos 
    foos = Foo.all 
    erb :something, locals: {list: foos} 
end 

def foos 
    bars = Foo.all 
    erb :something, locals: {list: bars} 
end 

而不是@vars,你必須使用相同的var_name,而不是真正代表裏面的內容。喜歡:這是一個什麼清單?

def bars 
    @list = Bar.all 
    erb :something 
end 

def foos 
    @list = Foo.all 
    erb :something 
end 

或者,也許你要善於與@vars,因爲大部分的時間,你重複使用視圖渲染時同種狀物體:

def foos 
    @foos = Foo.all 
    erb :something 
end 

def bar_foos 
    @foos = Foo.where(bar: true) 
    erb :something 
end 

所以你可能只是想利用大部分時間渲染部分時局部人在不同的環境中使用。像渲染@new_bar和現有的@bar時的表單一樣。只是一個例子。或者例如@current_user或簡單@user

+0

感謝您的詳細解答! – 0xSina

+0

很好的答案。我的2美分 - 儘可能限制變量的範圍。如果可以的話,我總是使用當地人(Rails依賴於實例變量讓我感到不寒而慄!)荒謬的對應點是,爲什麼不使用全局變量?由於缺乏範圍,他們被認爲是不好的,實例變量也沒有什麼不同。我在哪裏使用實例變量將值傳遞給佈局(標題,額外樣式表引用...)以及在'before'和'after'處理程序中設置的值。 – iain