Rails 3干燥iframe的条件布局

时间:2013-02-04 20:24:48

标签: ruby-on-rails-3 iframe dry

我最近的任务是在另一个网站上的iframe中加载我的部分Rails应用程序。相关页面应该使用不同的布局文件,但前提是它们是在iframe内部呈现的。这里提出了一个解决方案Detect iframe request in a rails app,它涉及传递查询字符串参数。

例如,请求网站可以通过if http://foo.com/bar?iframe=true的src来调用我的应用程序。然后在我们的控制器中,我们可以简单地检查:

def bar
  render :template => "iframe" if params[:iframe]
end

这似乎是一个很好的解决方案,但遗憾的是,只适用于初始请求,因为原始查询字符串是完全静态的。假设我们有iframe中其他路由的可访问链接,是否有任何方法可以轻松转发iframe=true请求参数以维护正确的iframe布局而无需重复代码?基本上我想在不破坏任何现有功能的情况下采用DRYest方法。我考虑创建另一个link_to帮助器,其中包含用于中继此参数的逻辑(如果存在)并替换我的整个应用程序中的所有link_to调用;我想知道是否有人有更好的方法。

1 个答案:

答案 0 :(得分:1)

我决定使用JavaScript解决这个问题,并将以下内容添加到我的haml布局文件中:

:javascript
    for(i = 0; i< $('a').length; i++)
    {
      if($('a')[i].href.match(document.domain))
      {
        $('a')[i].href = $('a')[i].href + "?iframe=true";
      }
    }

这与我对iframe参数的服务器端检查相结合将确保加载适当的布局。我决定只为启用JavaScript的用户提供此功能,因此它可能不是最佳解决方案。这种方法唯一的另一个问题在于控制器重定向和表单,我必须手动检查iframe参数,然后相应地转发它 - 根本不是DRY,但我至少能够将逻辑放入控制器方法中。如果有人知道更好的解决方案,请随时留下答案。