Rails 怎麼切割 mobile computer view 技巧 - lustan3216/BlogArticle GitHub Wiki

最下面的網站推薦的作法不錯,實作如何切割手機版的頁面,沒有RWD的時候可以用(像FB網頁比較複雜 就無法RWD 所以做成電腦版和手機版 m.開頭的網站)

但是沒解決我想要切割Web view與 Native Web view(app 混成)的做法

可以拿到瀏覽器的資訊,可以用這個來判斷是不是手機

request.user_agent =~ /Mobile|webOS|Android) && (request.user_agent !~ /iPad/
#=> "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"

以下做法是上面這篇文章的建議

def check_for_mobile
  session[:mobile_override] = params[:mobile] if params[:mobile]
end
#此方法可以強迫變更是不是手機版,特殊情況可以用

def mobile_device?
  if session[:mobile_override]
    session[:mobile_override] == "1"
  else
    # Season this regexp to taste. I prefer to treat iPad as non-mobile.
    (request.user_agent =~ /Mobile|webOS) && (request.user_agent !~ /iPad/)
  end
end
#此方法可以自動用request裡面的瀏覽器資訊 自動辨認是不是手機版

helper_method :mobile_device?
#寫了在這行 controller 裡面的 mobile_device? 也可以用在 helper也就是view裡面
#以下是把方法寫好包成最後一個 check_for_mobile 這樣就可以在任何一個你想要變成手機頁面的controller下
`before_filter :check_for_mobile, :only => [:new, :edit]`
這樣你可以指定你要的頁面會不會自動變成手機版頁面
判定如果是手機的話他會去 app/mobile_view 下去找頁面

class ApplicationController < ActionController::Base
  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"
    else
      # Season this regexp to taste. I prefer to treat iPad as non-mobile.
      (request.user_agent =~ /Mobile|webOS) && (request.user_agent !~ /iPad/)
    end
  end
  helper_method :mobile_device?
end

# app/controllers/posts_controller.rb
class PostsController < ApplicationController
  # Render mobile or desktop depending on User-Agent for these actions.
  before_filter :check_for_mobile, :only => [:new, :edit]

  # Always render mobile versions for these, regardless of User-Agent.
  before_filter :prepare_for_mobile, :only => :show
end