更改 Rails 3.1 中的视图格式(提供移动 html 格式,回退到普通 html)

2023-12-10

我正在我们普通的 html 网站旁边创建一个移动网站。使用导轨 3.1。移动站点在子域 m.site.com 中访问。

我已经定义了移动格式(Mime::Type.register_alias "text/html", :mobile)。

在 ApplicationController 中,我有“before_filter :mobile_site_before_filter”,它可以识别移动站点并根据它设置格式。

def mobile_site_before_filter
  if request.subdomains.first == 'm'
    original_format = request.format
    request.format = :mobile
    @mobile_site = true
    request.formats.push(original_format)
  end
end

在布局中,我有“main.html.erb”和“main.mobile.erb”。因此,移动网站使用移动布局。

现在可以正常工作了。

在 UserController 中,我有索引操作,它自动选择index.html.erb 或index.mobile.erb。无需在移动视图顶部进行额外编码。成功。

但我还有很多其他视图,其中相同的模板可用于在移动布局内提供服务,但只需进行一些细微的更改。

例如。在 MessagesController 中,相同的视图对于移动设备来说几乎没问题

In index.html.erb
Normal user info, common for mobile and html
<%= render(:partial => 'messages') %>

渲染messages.html.erb,不需要messages.mobile.erb。移动视图可以用css来完成

<%# By default self.formats = [:html] because this is .html.erb partial, even in mobile site %>
<%= self.formats = [:mobile, :html] if @mobile_site # How to get rid of this? %>
<%= render(:partial => 'vote_form') %>
<!-- rest of page ... -->

现在我想根据站点渲染 vote_form.[mobile|html].erb...

现在,如果我可以在 vote_form.html.erb 或 vote_form.mobile.erb 之间进行选择,那么 index.html.erb 部分就可以很好地与移动设备一起使用。我可以选择使用移动部分与使用 “self.formats = [:mobile, :html] if @mobile_site”位于 index.html.erb 的开头。但在所有模板的开头写这个感觉很愚蠢。

所以问题是:

  • self.formats 在视图中出现在哪里(最初设置它的是什么)以及如何设置它始终在移动网站内 [:mobile, :html] ?为什么它与我在控制器 before_filter 中设置的不一样?我可以在控制器中以某种方式设置它吗?

(小奖励问题)

  • 这种做法有什么问题吗?使用大部分相同的 html 视图,在某些特定情况下使用 mobile.erb 视图。为什么这在 Rails 中默认不起作用?

  • 如果发现回退到普通 html 视图,是否还有其他方法可以选择渲染 :mobile 视图?即使跨部分,以便 html.erb-view 尝试使用 _partial.mobile.erb 部分。


我想我已经找到了最好的方法来做到这一点。我正在尝试和你一样的事情,但后来我记得在rails 3.1中引入了模板继承,这正是我们需要这样的东西才能发挥作用。我真的不能对这个实现有太多的功劳,因为它的全部内容都在 Ryan Bates 的 Railscasts 链接中列出。

事情基本上就是这样的。

在中创建一个子目录app/views。我标记了我的mobile.

将要覆盖的所有视图模板嵌套在与视图目录中相同的结构格式中。views/posts/index.html.erb -> views/mobile/posts/index.html.erb

创建一个before_filter在你的Application_Controller并为此做一些事情。

 before_filter :prep_mobile
 def is_mobile?
   request.user_agent =~ /Mobile|webOS|iPhone/
 end 
 def prep_mobile
   prepend_view_path "app/views/mobile" if is_mobile?
 end

完成后,如果您的文件位于移动设备上,则它们将默认为移动视图;如果移动设备不存在,则将回退到常规模板。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改 Rails 3.1 中的视图格式(提供移动 html 格式,回退到普通 html) 的相关文章

  • 在表单中编辑序列化哈希?

    我正在序列化存储在settings表中的字段 并且希望能够在表单字段中编辑该哈希 class Template lt ActiveRecord Base serialize settings end 但我就是这么做那么文本区域只显示序列化数
  • 回形针:样式取决于模型(has_many 多态图像)

    我已将模型设置为使用多态图像模型 这工作正常 但是我想知道是否可以更改每个模型的 styles 设置 找到了一些使用 STI 模型 Art has many images as gt imageable Image belongs to i
  • ror 中的多种布局

    昨天刚开始使用 Ruby on Rails 在我的 layouts application html erb 中 我有 div class conta div
  • 如何使用 Rails 4 和 Ruby 2.0 应用程序进行实时重新加载?

    如果我在 Rails 4 Ruby 2 0 项目的文本编辑器中编辑 scss 或 erb 文件 我希望在浏览器中看到实时更改 我尝试了 Guard 和 Guard live reload 但它抛出以下错误 22 58 04 ERROR Co
  • 如何在 Rails 测试中填充查找表

    我在用Cucumber RSpec and 工厂女工用于测试我的 Rails 应用程序 但我有几个查找表 其中大部分包含static数据 所以我试图找出测试时填充这些的最佳方法 单独做它们FactoryGirl看起来很乏味 我想远离固定装置
  • RailsAdmin 中具有 join_table 和 has_many :through 的模型的路由错误

    所以我有3个模型 category product category products 这是我的category rb attr accessible name has many category products do def with
  • 将控制器操作处理为 JS 而不是 HTML

    所以我有以下形式 Follow 我试图
  • 捆绑包安装无法离线工作

    我得到了这个问题 我想已经安装了捆绑器 因为我无法在 RoR 中创建应用程序时捆绑安装 也无法直接在项目中捆绑安装 如果您遇到任何问题并找到解决方案 请帮助我 enter code here run bundle install Fetch
  • 未知属性:user_id

    我在执行 current user stories build 期间收到错误未知属性 user id class User lt ActiveRecord Base has many stories class name Story for
  • 如何使用国家宝石

    我正在尝试使用国家宝石 https github com hexorx countries 但是在我捆绑安装这个 gem 后 有一些关于如何合并它的基本问题 我是否需要创建新的控制器 模型才能访问这些国家 地区 如何创建一个简单的选择下拉列
  • 如何检查字符串是否为有效日期

    我有一个字符串 31 02 2010 并想检查它是否是有效日期 最好的方法是什么 我需要一个方法 如果字符串是有效日期 则返回 true 如果不是 则返回 false require date begin Date parse 31 02
  • Rails 4 可安装引擎,找不到文件“jquery”

    我正在创建一个 Rails 可安装引擎插件 它使用 gem jquery rails 我在 gemspec 文件中添加了这段代码 s add dependency jquery rails gt 3 0 1 and run bundle i
  • 子域中的 Rails url 助手 - 删除子域

    我网站上的用户可以拥有子域 例如 他们的页面网址是 name example com 登录的用户可以查看更多用户信息 因此在用户的显示页面上 我有一个使用以下代码生成的链接 user url user subdomain gt false
  • Rails:Passenger Standalone 适合生产部署吗?

    问题标题几乎概括了这一点 我找不到任何好的资源来概述使用 Phusion Passenger Standalone 进行 Rails 应用程序部署的优点 缺点 它与运行 Passenger Nginx 或 Passenger Apache
  • Rails 3.2 防止使用错误保存对象

    我有一个 ActiveRecord 对象 我想阻止它被保存 而不对模型进行永久验证 你曾经可以使用做这样的事情errors add但它看起来不再有效了 user User last user errors add name name doe
  • HTTP 状态码 302

    我正在用 Ruby 开发 Rails 后端 并且想将数据发布到该服务器 但如果我用 PAW 发出后请求 我就会被重定向 我是 Http 请求的新手 有人可以向我解释一下功能以及如何使用 http post 请求吗 我想在我的服务器数据库 s
  • 具有委托和条件的 Active Record

    是否可以在 Active Record 模型中使用委托并使用诸如 if on it class User lt ApplicationRecord delegate company to gt master if gt has master
  • Rails ActiveStorage:如何避免每个图像的一个重定向?

    如果您使用 ActiveStorage 并且您有一个包含 N 个图像的页面 您会收到对 Rails 应用程序的 N 个额外请求 即 N 个重定向 如果页面上有数十张图像 这意味着会浪费大量服务器资源 我知道重定向对于签名 URL 很有用 然
  • 如何调试速度慢得难以忍受的 Rails 资源预编译

    我正在开发一个 Rails 3 2 项目 尽管我不认为该项目很大 但近几个月来资产已经增加了相当多 资产由 JS 无咖啡脚本 和 SASS 文件组成 我们有很多图像 但从早期开始 它们出现的次数就更少了 所以我认为它们不是一个重要因素 我们
  • Rails CSS 样式表相互覆盖

    我在资产 样式表位置有一个clients css和jobs css 每个都有一个各自的控制器 乔布斯是在客户之后用脚手架创造出来的 scaffolds scss 文件为空 application css 为空 当我编码更改时 例如body

随机推荐