2

我正在使用移动 fu gem 进行一些用户代理检测,以便我可以根据客户端提供 .html 或 .mobile 扩展模板,

现在,这部分工作得非常好,但我不喜欢视图文件夹变得有点混乱,有两倍的文件,即。

app/views/profiles/show.mobile.haml

app/views/profiles/show.html.haml

app/views/profiles/edit.mobile.haml

app/views/profiles/edit.html.haml

等等等等

我想要的是:

app/views/profiles/html/show.html.haml

app/views/profiles/html/edit.html.haml

app/views/profiles/mobile/show.mobile.haml

app/views/profiles/mobile/edit.mobile.haml

并让 Rails 根据请求自动查找文件的正确文件夹/目录。 这可能吗?

也许这真的很容易做到,让我知道这是否是开箱即用的行为..

谢谢

4

1 回答 1

2

Rails 4.1 有一个名为ActionPack Variants的新内置功能,它可以检测用户代理(如移动 fu gem)。

基本上,您可以在 ApplicationController 中添加它:

before_action :detect_device_format

private

def detect_device_format
  case request.user_agent
  when /iPad/i
    request.variant = :tablet
  when /iPhone/i
    request.variant = :phone
  when /Android/i && /mobile/i
    request.variant = :phone
  when /Android/i
    request.variant = :tablet
  when /Windows Phone/i
    request.variant = :phone
  end
end

假设您有一个 ProfilesController。现在你可以这样做:

class ProfilesController < ApplicationController
  def index
    respond_to do |format|
      format.html          # /app/views/profiles/index.html.erb
      format.html.phone    # /app/views/profiles/index.html+phone.erb
      format.html.tablet   # /app/views/profiles/index.html+tablet.erb
    end
  end
end

回到你的问题:如果你想在不同的文件夹/目录中查找文件,你可以这样做:

format.html.phone { render 'mobile/index' }   # /app/views/mobile/index.html+phone.erb

还有一个很好的教程展示了如何使用它。

于 2014-06-02T20:26:49.403 回答