You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取gem 'rqrcode-with-patches' ~>0.5.4二维码的扫描设备及位置信息

Hey there! Let's break this down clearly—QR codes themselves don't have the ability to collect device or location data directly; they're just a way to encode a piece of text (usually a URL). To get that info, you need to point the QR code to a web endpoint or page that can capture and store those details when someone scans it. Here's how to set this up with rqrcode-with-patches and a Ruby backend:

Step 1: Generate a QR Code Pointing to Your Web Endpoint

First, create a QR code that links to a dedicated route in your app (like a Rails controller action or a Sinatra endpoint). This is straightforward with the gem:

require 'rqrcode'

# Replace with your actual app endpoint URL
scan_url = "https://your-app-domain.com/qr-scans"
qr_code = RQRCode::QRCode.new(scan_url)

# Generate a PNG version of the QR code
png = qr_code.as_png(
  bit_depth: 1,
  border_modules: 4,
  color_mode: ChunkyPNG::COLOR_GRAYSCALE,
  color: 'black',
  fill: 'white',
  module_px_size: 6,
  size: 120
)

# Save the QR code to a file (or render it directly in your app)
File.open("scan_qr.png", "wb") { |f| f.write(png.to_s) }
Step 2: Capture Device Information on Your Backend

When a user scans the QR code, their device sends a request to your endpoint. You can extract device details from the request headers:

Example Rails Controller Action

class QrScansController < ApplicationController
  def create
    # Pull device-related data from the request
    user_agent = request.user_agent
    ip_address = request.remote_ip

    # Store this data (adjust based on your database setup)
    QrScan.create(
      user_agent: user_agent,
      ip_address: ip_address,
      scanned_at: Time.current
    )

    # Redirect to a thank-you page or your main app
    redirect_to root_path, notice: "Scan recorded successfully!"
  end
end

To make sense of the messy user_agent string, use the useragent gem to parse it into structured data:

# Add gem 'useragent' to your Gemfile first
require 'useragent'

agent = UserAgent.parse(user_agent)
device_type = agent.mobile? ? "Mobile" : "Desktop"
os_version = agent.os.to_s
browser = agent.browser.to_s
Step 3: Get the User's Location

There are two reliable ways to capture location data, each with tradeoffs:

Option 1: Frontend Geolocation (Most Accurate)

Redirect users to a simple HTML page that asks for location permission via the browser's Geolocation API, then sends coordinates to your backend.

Example HTML Page (embed in your view or serve as static file)

<!DOCTYPE html>
<html>
<head>
  <title>Processing Your Scan</title>
  <meta name="csrf-token" content="<%= form_authenticity_token %>">
</head>
<body>
  <script>
    // Request location access from the user
    navigator.geolocation.getCurrentPosition(
      (position) => {
        // Send coordinates to your backend endpoint
        fetch("/qr-scans", {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
            "X-CSRF-Token": document.querySelector('meta[name="csrf-token"]').content
          },
          body: JSON.stringify({
            latitude: position.coords.latitude,
            longitude: position.coords.longitude
          })
        }).then(() => {
          window.location.href = "/thank-you";
        });
      },
      (error) => {
        // Handle permission denial or location errors
        window.location.href = "/qr-scans?no_location=true";
      }
    );
  </script>
</body>
</html>

Update your controller to accept and save the location data:

def create
  location_data = params.permit(:latitude, :longitude)
  
  QrScan.create(
    user_agent: request.user_agent,
    ip_address: request.remote_ip,
    latitude: location_data[:latitude],
    longitude: location_data[:longitude],
    scanned_at: Time.current
  )

  redirect_to root_path, notice: "Scan recorded!"
end

Option 2: IP-Based Geolocation (No User Permission Needed)

If you don't want to ask users for permission, use their IP address to get a rough location. The geocoder gem simplifies this:

# Add gem 'geocoder' to your Gemfile
require 'geocoder'

location = Geocoder.search(request.remote_ip).first
if location
  city = location.city
  country = location.country
  rough_latitude = location.latitude
  rough_longitude = location.longitude
end

Note: IP-based location is often approximate (especially for mobile users on cellular networks) and won't work for users on VPNs.

Key Things to Remember
  • User Consent: For accurate location data, users must grant permission to their device/browser—always be transparent about why you're collecting this data.
  • Data Accuracy: User-Agent strings can be spoofed, and IP-based location isn't 100% reliable.
  • Privacy Compliance: Make sure you follow laws like GDPR or CCPA when storing user data—don't collect more than you need, and let users know how you'll use it.

内容的提问来源于stack exchange,提问作者ruby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:40:27