无法识别是从桌面还是移动设备访问

Posted

技术标签:

【中文标题】无法识别是从桌面还是移动设备访问【英文标题】:Can't recognize if it's accessed from desktop or mobile 【发布时间】:2015-03-22 16:11:47 【问题描述】:

我正在尝试为移动设备创建视图。我找到了别人的代码,这是在ApplicationController:

def check_for_mobile
  session[:mobile_override] = params[:mobile] if params[:mobile]
  prepare_for_mobile if mobile_device?
end
def prepare_for_mobile
  prepend_view_path Rails.root + 'app' + 'views_mobile'
end
def mobile_device?
  if session[:mobile_override]
    session[:mobile_override] == "1"
    session[:is_mobile] = nil
  else
    (request.user_agent =~ /(iPhone|iPod|android|webOS|Mobile|iPad)/)
    session[:is_mobile] = true
  end
end
helper_method :mobile_device?

代码无法正确区分桌面设备和移动设备。当我运行此代码时,即使我在笔记本电脑上使用该应用程序,也会为移动设备生成视图。这是为什么呢?

我不明白方法check_for_mobile的定义。 params[:mobile] 来自哪里?

【问题讨论】:

对于 Rails 4,您应该使用变体,即支持移动视图的构建。详情在这里:guides.rubyonrails.org/… 克里斯蒂安,谢谢你,我遵循了这种方法,它就像一个魅力!请随时添加它作为答案,我会接受它。 我添加了变体作为答案。 【参考方案1】:

params[:mobile] 在 URL 中设置。奇怪的是网站的页眉/页脚中有一个链接,其中包含当前 url 和 ?mobile=1 附加。无论用户代理如何,上面的代码都会看到并切换到移动视图。

【讨论】:

【参考方案2】:

Rails 4.1 引入了一个新概念 variants,它允许您为每种设备构建视图。

# The request variant is a specialization of the request format,
# like :tablet, :phone, or :desktop.
# Example from Rails upgrade Guide:

before_filter do
  request.variant = :tablet if request.user_agent =~ /iPad/
end

respond_to do |format|
  format.html do |html|
    html.tablet # renders app/views/projects/show.html+tablet.erb
    html.phone  extra_setup; render ... 
  end
end

【讨论】:

以上是关于无法识别是从桌面还是移动设备访问的主要内容,如果未能解决你的问题,请参考以下文章

地理位置无法在移动设备上运行,但可以在我的桌面上运行

在移动设备和桌面设备之间切换悬停在下拉菜单上

innerWidth 在移动设备上没有得到正确的宽度

如何知道我的 Flutter Web 应用程序是在移动设备还是桌面设备上运行

根据用户是移动设备还是桌面设备显示不同的标题图像? (Wordpress,“二十七”)

Facebook 登录无法在移动设备上使用(但可以在桌面设备上使用)