Ruby on rails Rails加载覆盖其他辅助对象的辅助对象

Ruby on rails Rails加载覆盖其他辅助对象的辅助对象,ruby-on-rails,mobile,overriding,desktop,helpers,Ruby On Rails,Mobile,Overriding,Desktop,Helpers,这个问题分为两部分: 是否可以加载特定的帮助文件取决于您使用的平台 如何重写其他帮助文件中的函数 当我检测到使用手机的会话时,我想加载名为MobileHelper的帮助文件。在桌面平台中,我不想加载此文件 另一方面,我有一个带有show\u comments功能的WelcomeHelper。此MobileHelper必须更改此show\u comments功能的逻辑 现在,我提出了一个局部解决方案,如果检测到您正在使用手机,则在原始函数中使用其他名称调用mobile version函数 modu

这个问题分为两部分:

  • 是否可以加载特定的帮助文件取决于您使用的平台
  • 如何重写其他帮助文件中的函数
  • 当我检测到使用手机的会话时,我想加载名为MobileHelper的帮助文件。在桌面平台中,我不想加载此文件

    另一方面,我有一个带有show\u comments功能的WelcomeHelper。此MobileHelper必须更改此show\u comments功能的逻辑

    现在,我提出了一个局部解决方案,如果检测到您正在使用手机,则在原始函数中使用其他名称调用mobile version函数

    module WelcomeHelper
      def show_comments
        return mobile_show_comments if user_agent.mobile?
        # original code
      end
    end
    
    module MobileHelper
      def mobile_show_comments
        # mobile code
      end
    end
    
    我想要的最终版本是两个助手文件中的两个同名函数其中一个文件必须仅在移动平台上加载

  • 可以在给定请求头(例如用户代理)的情况下加载文件(这会告诉您用户所在的平台)。但一旦加载文件,它将保持加载状态,因为您的服务器仍在请求之间运行。但是,默认情况下,Rails将在启动服务器时加载所有文件(包括帮助程序),并在请求之间保持加载状态。因此,根据请求加载文件不是一种好方法,除非您自己手动管理模块或类的删除:

  • Rails将帮助程序包含到视图和控制器中的方式非常简单,它只是将帮助程序中定义的所有方法添加到控制器和视图中。因此,您将无法将一个方法从一个辅助对象重写到下一个辅助对象

  • 我认为您的案例的一个可能解决方案是:

    # check for the platform the user is on:
    if request.user_agent.match /iphone|android/
      # call your mobile helper's method here
    else
      # call default helper's method here
    end
    

    由于Rails启动时您的所有助手都已加载,因此您必须根据当前请求的用户代理将其分派给相应的助手。

    这有点过时,但您可能会发现有帮助。他们的方法是将.mobile注册为mime类型,然后通过目标视图处理桌面浏览器和移动浏览器之间的差异


    另一种可能的策略是为路由命名,这样就有一组用于桌面的路由和另一组用于移动设备的路由。当用户第一次访问站点时,您应该将他们重定向到适当名称空间内的页面。使用这种方法,您可以创建DesktopBaseController和MobileBaseController(每个都继承自ApplicationController),其中包括适用于desktop/mobile的相应帮助程序。命名空间控制器可以从相应的桌面/移动基础继承。这可能会导致许多关于如何保持代码干燥的决策,但它为处理桌面和移动浏览中的差异提供了很大的灵活性(例如,寻呼机除了以不同方式呈现外,还可能获得较少的记录等)。

    如果项目没有实际完成,此解决方案将非常有用。将来我会尝试使用它。