我有一个手机版的网站,我正在开发。我正在使用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 %>