2009-08-13 44 views
7

我需要消息在項目中有不同的佈局,是否有可能在rails中做這樣的事情?在rails中可以動態加載類佈局嗎?

Class Messages::New < @project? ProjectLayout : NormalLayout 
end #i treid this, don't work, since @project has not been initiated. 

感謝

回答

0

決定在控制器中的佈局而不是模型。您的ProjectsController可以使用它自己的ProjectLayout,然後MessagesController可以使用正常的佈局,如果你願意。

2

您只能在控制器級應用的佈局:

class MessagesController < ApplicationController 
    layout :project 
end 

Layout method documentation有關於如何做到有條件的佈局

2

而且,因爲這個問題是不清楚一個例子,你還可以設置佈局只一個動作與渲染選項。

render :action => 'new', :layout => 'layoutname' 
16

這可能會幫助你

class MessagesController < ApplicationController 
    layout :get_layout 

    def get_layout 
    @project? ? 'ProjectLayout' : 'NormalLayout' 
    end 

end 
1

只能在controller水平和個人action級別應用的軌道佈局。在每個控制器

class MessagesController < ApplicationController 
    layout "admin" 

    def index 
    # logic 
    end 
end 

**以上線layout "admin"

獨特的佈局將每個消息控制器被調用時加載管理員佈局。對於這一點,你必須在你的layouts/admin.html.rb文件創建的佈局。**

每個控制器

class MessagesController < ApplicationController 
    layout :dynamic_layout 

    def index 
    # logic 
    end 

protected 
def dynamic_layout 
    if current_user.admin? 
     "admin"  # Show admin layout 
    else 
    "other_layout" # Show other_layout 
    end 
    end 
end 

#個人行動水平佈局 動態佈局如果你想顯示不同的佈局每個行動你可以做到這一點。

class MessagesController < ApplicationController 
    layout :dynamic_layout 

    def index 
    # logic 
    render :action => 'index', :layout => 'index_layout' 
    end 

    def show 
    # logic 
    render :action => 'show', :layout => 'show_layout' 
    end 
end 
0

我的兩分錢中的ApplicationController:

before_action :layout_by_action 

@@actions = %w(new edit create update index) 

def layout_by_action 
    if @@actions.include? params[:action] 
    self.class.layout 'admin' 
    else 
    self.class.layout 'application' 
    end 
end