2011-06-22 22 views
0

我正在使用Ruby on Rails,並試圖加載由多個子頁面組成的頁面。每個子頁面都非常不同,每個子頁面的數據都是由控制器中的單獨操作生成的。在加載主頁面時,我想通過調用相應的動作來加載子頁面的內容。在rails上的一個請求中呈現多個操作的結果

所以我的問題是,是否有可能在單個頁面請求時觸發對不同操作的多個請求。如果是這樣,實現這一目標的最佳方法是什麼,以便每個操作的結果視圖顯示在頁面的正確部分?如果這是不可能的,我還可以在單​​個請求中加載從不同操作處理的內容嗎?

理想情況下,可以從不同的地方調用子頁面的動作(例如,子頁面可以是不同頁面的組件,也可以是其自己的頁面)。我想從控制器中調用動作的地方抽象出來,這樣我就可以簡單地爲控制器生成的數據渲染適當的部分。但關鍵是這部分不會在控制器中確定,而是在視圖中。有這樣的事情嗎?有更好的選擇嗎?

謝謝!

回答

0

你想做的事不應該通過調用不同的動作來解決。

在控制器中,您知道要在視圖中顯示哪些模型,因此您可以相應地設置屬性,例如,

@user = current_user 
@team = current_user.team.first 
@top_teams = Team.top5 # this is a scope returning the 5 top teams 

在你看來,你然後用諧音來呈現你的網站

<%= render "users/parts/box", :user => @user %> 
<%= render "teams/parts/detail", :team => @team %> 
<%= render "teams/parts/top", :collection => @top_teams %> 

的不同部分,我建議你看看Opensourcerails, which itself is open source並利用這種技術。一個很好的例子是用戶的表演動作。

0

我不完全知道你想要什麼。但絕對不能將其他行爲視爲當前行爲的一部分。

但是,您可以在控制器上編寫私有方法來設置變量,並在視圖文件中包含相應的常見部分。

這是一個例子:

class UsersController < ... 
    def show 
    @user = current_user 

    setup_user_friends_widget(@user) 
    end 

    private 

    def setup_user_friends_widget(for_who) 
    @use_user_friends_widget= true 

    @friends = for_who.friends 
    end 
end 

# in your view users/show.html.erb 

<%- if @use_users_friend_widget %> 
    <%= render :partial => "shared/widgets/user_friends" 
<%- end %> 

# in shared/widgets/_user_friends 

<%- @friends.each do |friend| %> 
    # use the instance variables directly because you have to call the setup_user_friends_widget method before you could use this widget. 
    # so you are safe to use the instance variables instead of passing them from render :partial 

    ... 
%> 

通過這種方式,你可以提取那些共用的東西出來要控制器私有方法,如果你需要他們這些方法自動訪問參數,可以會話,餅乾。

相關問題