2013-11-21 38 views
1

这个问题有两个部分:Rails的负载帮手覆盖其他辅助

  1. 这是可能加载,还是没有,具体的辅助文件,这取决于平台您使用?
  2. 如何覆盖其他帮助文件中的函数?

我想加载一个名为的助手文件MobileHelper当我使用手机检测会话时。在桌面平台上我不想加载这个文件。

另一方面,我有一个欢迎使用帮助show_comments功能。这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 

最终版本我想有是两个相同的命名函数两个辅助文件此文件中的一个必须是唯一的在移动平台上

回答

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

  2. 的方式Rails包含助手到视图和控制器是非常简单,它只是增加了所有方法在助手中定义到控制器和视图。由于这个原因,你将无法重写一个助手到另一个助手的方法。

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。

0

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

另一个潜在的机会是命名空间的路由,以便有一组桌面和另一个移动路线。当用户第一次访问该网站时,您会将它们重定向到适当名称空间内的页面。通过这种方法,您可以创建一个DesktopBaseController和MobileBaseController(每个都继承自ApplicationController),其中包括适用于桌面/移动设备的适当助手。命名空间控制器可以从适当的桌面/移动基地继承。这可能会导致关于如何保留代码的大量决策,但它为处理桌面和移动浏览方面的差异提供了很大的灵活性(例如,除了渲染不同之外,寻呼机可能获得更少的记录等)。

+0

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