覆盖rails helper route方法以从GET参数设置布局

时间:2012-05-29 09:39:07

标签: ruby-on-rails ruby-on-rails-3 routes

我正在尝试根据每个请求的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

谢谢!

2 个答案:

答案 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

如果它不合适,它就会关闭。