我需要消息在项目中有不同的布局,在rails中可以做这样的事情吗?
Class Messages::New < @project? ProjectLayout : NormalLayout
end #i treid this, don't work, since @project has not been initiated.
感谢
答案 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
}