2

我正在尝试根据每个请求的 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 route helper 上添加这个参数(即使是表单中的 POST 请求......):

ressource_path(@ressource, :layout => get_layout_from_url())

whereget_layout_from_url()是一个帮助器,它检查是否params['layout']在 URL 中设置,验证然后返回它。

这绝对不是 DRY ......我如何覆盖每个路由助手以包含此行为而不在我的视图中编写任何额外的代码?我想在我的观点中调用标准的 rails 方法:ressource_path(@ressource), ...

还是有更聪明的方法来实现这一目标?

PS:我使用的是 rails 3.2.3

谢谢 !

4

2 回答 2

2

我认为您最好将其存储在会话中,而不是将其附加到每个请求的 url 中。

在 Rails 中,您可以以非常简单的方式使用 session:

def get_layout_from_params
  if params['layout']
    session['layout'] = params['layout']
  else
    session['layout'] || 'application'
  end
end

如果有params['layout'],则表示用户将要更改布局,因此您将其分配给会话。

如果没有params['layout']给定,则检查是否存在,如果 session['layout'] 为 false 或 nil ,则session['layout']返回或返回。'application'

- - 编辑 - -

以下版本更短,看你喜不喜欢:

def get_layout_from_params
  session['layout'] = params['layout'] || session['layout'] || 'application'
end
于 2012-05-29T09:47:07.470 回答
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

如果它不适合,它是接近的。

于 2012-05-29T09:56:33.453 回答