我正在尝试根据每个请求的URL中传递的GET参数更改应用程序的布局:&layout=name_of_the_layout
。
在我的application_controller中:
class ApplicationController < ActionController::Base
layout :get_layout_from_params
private
def get_layout_from_params
if params['layout']
params['layout']
else
'application'
end
end
end
它工作正常,但是当用户在应用程序中导航时“坚持”布局时,我需要在我的视图中的每个rails路径助手上添加此参数(即使对于表单中的POST请求...):
ressource_path(@ressource, :layout => get_layout_from_url())
其中get_layout_from_url()
是一个帮助程序,用于检查URL中是否设置了params['layout']
,验证然后返回它。
这绝对不是DRY ...如何在不在我的视图中编写任何其他代码的情况下覆盖每个路由助手以包含此行为?我想在我的视图中调用标准rails方法:ressource_path(@ressource), ...
或者有更聪明的方法来实现这一目标吗?
PS:我正在使用rails 3.2.3
谢谢!
答案 0 :(得分:2)
我认为您最好将其存储在会话中,而不是将其附加到每个请求的URL。
在rails中,您可以以非常简单的方式使用会话:
def get_layout_from_params
if params['layout']
session['layout'] = params['layout']
else
session['layout'] || 'application'
end
end
如果有params['layout']
,则表示用户将更改布局,因此您将其分配给会话。
如果没有给出params['layout']
,那么它会检查是否有session['layout']
,如果会话['layout']为false或nil,则返回它或返回'application'
。
---编辑---
以下版本更短,看你是否喜欢:
def get_layout_from_params
session['layout'] = params['layout'] || session['layout'] || 'application'
end
答案 1 :(得分:2)
旧版已被弃用default_url_options
现已替换为url_options
:
class ApplicationController < ActionController::Base
def url_options
{ :layout => validate_layout }.merge(super)
end
def validate_layout
# some stuff reusable
params[:layout]
end
end
如果它不合适,它就会关闭。