Rails 3为移动用户处理Javascript



我有一个手机版的网站,我正在开发。我正在使用Ryan Bates的Railscast章节中描述的技术来进行移动检测。简而言之,您必须编写一个控制器动作来检测这是否是一个移动浏览器,如果是,则将请求格式设置为"mobile"。因此,您可以使用名称格式为"file.mobile"的视图。Erb " beside "file.html.erb".

这个效果很好。但是我需要支持远程脚本执行,因此我希望它也能提供Javascript的移动版本。

下面是视图中的表单声明:

<%= form_for :humanity, :url=>{:action=>"human"}, :remote=>true do |h| %>

在桌面版本中,它正确地调用控制器动作。日志中:

Processing by CardsController#human as JS

但是当我从移动版本调用它时,日志不会将其挑选为JS:

Processing by CardsController#human as */*

所以我首先要弄清楚如何让表单告诉控制器它需要Javascript。假设我可以做到这一点,那么我认为对@rbates代码的修改应该会把我锁定(正如Railscast帖子上的一位评论者所建议的那样)。这是在application_controller中。Rb,在prepare_for_mobile方法中:

if mobile_device?
    if request.format == :js
        request.format = :mobilejs
    else
        request.format = :mobile
    end
end

所以我有一个"human.mobilejs"。erb"文件准备触发,除非控制器正确地承认它正在收到一个JS请求!

期待您的慷慨协助!

亚伦

Add !request.xhr?在application_controller.rb

中的以下函数中
def prepare_for_mobile
  session[:mobile_param] = params[:mobile] if params[:mobile]
  request.format = :mobile if mobile_device? && !request.xhr?
end

它将用format.js

响应.js请求

另外,正如genkilabs建议的那样,使用mobile_fu。

Aaron,你的思路是对的。然而,不是检查request.format == :js(或者更糟的是,如果使用jQuery Mobile这样的框架,request.xhr?会杀死你)之类的东西,而是检查mime类型。下面是我所做的:

if mobile_device? and request.format.to_s == "text/html"
  request.format = :mobile
elsif mobile_device? and request.format.to_s == "text/javascript"
  request.format = :mobilejs
end

然后你可以包括一个format.mobilejs {}块和做几乎你会做一个普通的js块(渲染出一个Javascript模板,等)

我让它工作,但感觉它是一个讨厌的,黑客的解决方案。

根据另一个SO帖子的提示,我覆盖了控制器动作中的渲染,如下所示:

if mobile_device?
   render :file => "#{RAILS_ROOT}/app/views/cards/human.mobilejs.erb"
end

我已经在/config/initializers/mime_types.rb中注册了"mobilejs"作为javascript mime类型:

Mime::Type.register_alias "text/javascript", :mobilejs

所以它开始击中我的移动脚本。万岁!但此后,我试图在脚本中添加的每个部分都失败了,因为它也需要移动格式。所以我用mobilejs扩展为每一个部分创建了一个新的副本,它正在工作。很恶心,但它有效。

我不确定我完全理解你的问题,但也许你可以使用像mobile-fu这样的东西进行检测。

https://github.com/brendanlim/mobile-fu

给你这样的方法,is_mobile_device吗?# =>根据设备返回true或false

然后从你的布局中生成你想要使用的JS文件。ie。在你的布局中放入:

<!DOCTYPE html>
<html>
<head>
  <title>sweet app</title>
  <%= stylesheet_link_tag "jquery", :media => :screen %>
  <%= stylesheet_link_tag "main", :media => :screen %>
  <%= javascript_include_tag :defaults %>
  <%= yield :script_includes %>
  <%= csrf_meta_tag %>
</head>

然后在你正在渲染的视图中,你可以选择把哪个js标签放在那里。在some_view。html中。动词或some_view.mobile.erb

<% content_for :script_includes do %>
  <% if is_mobile_device? %>
  <%= javascript_include_tag "jquery-mobile.js" %>
  <% else %>
  <%= javascript_include_tag "jquery-unmovable.js" %>
  <% end %>
<% end %>

相关内容

  • 没有找到相关文章

最新更新