在rails中可以动态加载类布局吗?

时间:2009-08-13 22:33:23

标签: ruby-on-rails ruby

我需要消息在项目中有不同的布局,在rails中可以做这样的事情吗?

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

感谢

7 个答案:

答案 0 :(得分:19)

这可能会对你有所帮助

class MessagesController < ApplicationController
  layout :get_layout

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

end

答案 1 :(得分:2)

您只能在控制器级别应用布局:

class MessagesController < ApplicationController
  layout :project
end

Layout method documentation有一个关于如何进行条件布局的例子

答案 2 :(得分:2)

此外,由于问题不明确,您还可以使用渲染选项仅为一个操作设置布局。

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

答案 3 :(得分: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

答案 4 :(得分:0)

确定控制器中的布局而不是模型。您的ProjectsController可以使用它自己的ProjectLayout,然后如果您愿意,MessagesController可以使用正常的布局。

答案 5 :(得分: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

答案 6 :(得分:0)

您可以使用Proc

layout -> {
    if something?
      'my-layout'
    else
      'my-other-layout'
    end
  }