更改 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) 的相关文章

  • 为什么 Capistrano 部署在资产:预编译时失败而没有错误?

    我已经尝试了我能想到的一切 但我无法让部署工作 该应用程序需要部署到由Alwaysdata托管并运行ruby 2 6 2的VPS 使用Capistrano进行部署 这是一个 Rails 6 0 2 2 应用程序 使用 webpack 处理
  • Rails 4 - 如何安装“jquery-ui”?

    为了使用 jquery 自动完成插件 我需要安装jquery ui gem 到目前为止 我的 gemfile 中有以下内容 gem jquery rails 所以我补充道 gem jquery ui rails And to applica
  • 数据库被锁定?

    我如何修复数据库锁 因为我的测试没有通过 它使同一类别中的一堆测试失败 谢谢 1 UsersController GET edit should have a link to change the Gravatar Failure Erro
  • 设计如何覆盖 send_confirmation_instructions

    我正在尝试重写方法 send confirmation instructions 如下所示 http trackingrails com posts devise send confirmation mail manually or del
  • 如何在 Rails 2 中正确使用 OmniAuth

    我正在尝试为我的应用程序使用 OmniAuth 0 2 6 策略 架构为 Rails 2 3 10 Rack 版本为 1 1 OmniAuth 需要此版本或更高版本 出现的问题是 Rails 无法识别我重定向到 auth provider
  • 弃用警告:ActionView::Base 实例应使用查找上下文、赋值和控制器来构造

    我将应用程序从 Rails 5 2 迁移到 Rails 6 只剩下一件事要做 但我不知道如何做 我有这个弃用警告 弃用警告 ActionView Base 实例应使用查找上下文 赋值和控制器来构造 从 Users xxx xxxx app
  • Stripe Connect - 检索访问令牌

    我正在尝试为 Rails 3 2 13 应用程序设置 Stripe Connect 我已将用户引导至 Stripe 并收到了来自 Stripe 的授权码 HTTP 1 1 302 Found Location http localhost
  • Rails:CSS 在开发和生产中似乎有所不同

    我有一个标准的 Rails 4 heroku 设置 有一点很奇怪 页面的不同元素在本地环境和生产环境中以不同的尺寸显示 例如 虽然 header height 设置为特定的像素值 但两个环境的高度不同 与内容的宽度相同 我将最大宽度设置为
  • Rails:如何测试 lib/ 目录中的代码?

    我有一个从解析器对象获取数据的模型 我认为解析器类应该位于 lib 目录中 尽管我可以说服它应该位于其他地方 问题是 解析器类的单元测试应该在哪里 如何确保每次运行 rake 测试时都运行它们 在我正在开发的 Rails 应用程序中 我决定
  • 黄瓜和 Rspec

    任何人都可以向我推荐黄瓜和 rspec 教程 rails 3 的好来源 简单示例 吗 Edit 实际上我正在寻找带有很好示例的免费在线资源 我觉得R规格书 http www pragprog com titles achbd the rsp
  • Ruby - 乘法问题

    我的输出是这样的 ruby 1 9 2 p290 011 gt 2 32 3 gt 6 959999999999999 我记得有一天在另一台机器上我得到了它就像 2 32 3 6 我的错误是什么 非常感谢您阅读本文 如果您确实想向下舍入为整
  • 在 Ruby on Rails 中渲染部分集合正在乘以项目

    我想在 Ruby on Rails 的页面中显示项目列表 我使用部分 in my index html erb我有的文件 in list news html erb I have div class news div
  • 为铁路中的自引用关联建立工厂

    我有一个典型的要求 我必须按如下方式处理用户对象 user referrer and user referrers 基本上 用户可以推荐多个人 并且一个人应该由一位特定用户推荐 所以我按如下方式建立关联 他们工作得很好 class User
  • Facebook 注册后重定向至页面

    我正在尝试在成功 Facebook 注册 未登录 后重定向用户 我想重定向到 getstarted welcome用户注册后首次 我的omniauth回调是 def facebook You need to implement the me
  • Rails 3 ActiveAdmin。如何为关联记录设置默认排序顺序?

    我有一个发货模型和一个发票模型 发票属于装运 所以我添加了一个默认的发货排序顺序 如下所示 config sort order file number desc 但现在我想为发票添加相同的排序顺序 发货表是具有 file number 列的
  • Rails has_many 通过使用 source 和 source_type 为多种类型设置别名

    这是一个示例类 class Company lt ActiveRecord Base has many investments has many vc firms through investments source investor so
  • Rails 和 Mysql 的毫秒数

    使用 Rails Mysql 时存储时间 以毫秒为单位 的最佳方式是什么 我将使用小数和composed of 以便能够将该值作为Ruby 时间进行操作 有人有更好的主意吗 自从提出这个问题以来 已经过去了好几年了 这是更新的解决方案 ht
  • 如何让我的导航栏出现在 Rails 应用程序的每个页面上?

    目前 我的导航栏位于我的index htm erb 文件中 目前仅在主页上显示 我想知道为了让导航栏出现在我的应用程序的每一页上 必须采取哪些必要步骤 我的导航栏的代码如下所示
  • ruby 调试和黄瓜

    我在 Cucumber 中遇到了失败的情况 我想使用 ruby debug 来调试我的 Rails 控制器 但是 如果我将 调试器 添加到我想要中断的位置 它就不会停止 我尝试将 ruby debug 和 ruby gems 的 requi
  • 使用 shoulda 重构 Rails 模型上的 rspec 测试

    了解后应该匹配器 https github com thoughtbot shoulda matchers通过回答关于属性可访问性测试的另一个 StackOverflow 问题 https stackoverflow com a 11849

随机推荐