Rails加载帮助程序,覆盖其他帮助程序

时间:2013-11-21 17:13:09

标签: ruby-on-rails mobile override desktop helpers

这个问题分为两部分:

  1. 根据您使用的平台,可以加载或不加载特定的Helper文件吗?
  2. 如何覆盖其他帮助文件中的函数?
  3. 我想在使用移动设备检测会话时加载名为 MobileHelper 的帮助文件。在桌面平台中,我不想加载此文件。

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

    到目前为止,我做了一个部分解决方案,如果它检测到你正在使用移动设备,则在原始功能中调用带有其他名称的移动版本功能。

    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
    

    我想要的最终版本是两个相同的命名函数 两个帮助文件其中一个文件必须仅在移动平台上加载

2 个答案:

答案 0 :(得分:0)

  1. 可以加载给定请求标头的文件,例如user-agent(它将告诉您用户所在的平台)。但是一旦文件被加载,它将保持加载,因为您的服务器在请求之间保持运行。但是,默认情况下,Rails将在您启动服务器时加载所有文件(包括帮助程序),并将在请求之间保持加载状态。因此,除非您自己手动管理模块或类的删除,否则在请求的基础上加载文件不是一个好方法:How to undefine class in Ruby?

  2. Rails将助手包含在视图和控制器中的方式非常简单,它只是将助手中定义的所有方法添加到控制器和视图中。由于这个原因,您将无法将方法从一个帮助器覆盖到下一个帮助器。

  3. 我看到的1种可能的解决方案是:

    # 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启动时已经加载了所有帮助程序,因此您必须根据当前请求的user_agent调度到相应的帮助程序。

答案 1 :(得分:0)

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

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

相关问题