有条件的用户代理检查需要变干

问题描述:

如果客户端在ie7(barf)上,我只是将此条件写入不同的社交区域;因为我们的两个社交网络不再支持ie7(pinterest/google plus)。有条件的用户代理检查需要变干

我想将用户代理检查从部分移动到更清晰,更人性化的东西。我试图将条件移动到名为is_this_ie7的方法?在一个帮手和控制器,都给我一个未定义的方法休息。

如果我是一个更有经验的RoR开发人员,这会去哪里?提前致谢!!!!

 <!-- if ie7 load seperate helper since gplus dones't support --> 
    <% if request.env['HTTP_USER_AGENT'] =~ /msie 7.0/i %> 
      <%= share_area_for_bidding_ie7 %> 
    <% else %> 
     <!-- if any other browser load main share area --> 
     <%= share_area_for_bidding %> 
    <% end %> 

将其插入到所需的页面中。最好让浏览器嗅探客户端。但是,如果你真的有这样做的Rails的模板,你可以做一个帮手:

_social.html.erb

<% if ie7?(request) %> 
    do ie7 stuff 
<% else %> 
    do other stuff 
<% end %> 

application_helper.rb

def ie7?(request) 
    if request.user_agent 
    !!request.user_agent.match(/msie 7.0/i) 
    end 
end 
+0

这是我最感兴趣的。编辑你的帖子以在视图中添加(请求)。如果我再次使用它,我会把它放在模型中。感谢大家! – jahrichie

+0

感谢您的编辑。顺便说一下,即使你不把它作为参数从视图中传递出去,request也是可用的,但是这样做会被认为是不好的做法(因为你会依赖一个不可能的变量在那里取决于模块在哪里)。 – bricker

+0

感谢您的帮助!我得到了“错误的参数数量(0代表1)”,这就是为什么我把它作为参数传递的原因。思考? – jahrichie

我觉得这段代码在布局上应该没问题。您已经将大部分逻辑抽象为功能。让它在布局中可以让你从控制器渲染这个布局。

这也可能在一个视图文件中,但如果您在多个页面中需要它,您将不得不复制该多个视图文件的相同代码。或者使用content_for

+0

真。我最感兴趣的是一种用于条件检查的方法,因为它不像应该那样。 – jahrichie

通常在助手中,如果你想对TDD灵活,你可以为字符串和请求做一个方法:

# ./app/helpers/application_helper.rb 

def agent_ie7?(agent) 
    agent =~ /msie 7.0/i 
end 

def request_ie7? 
    agent_ie7?(request.env['HTTP_USER_AGENT']) 
end 

一个更强大的答案是模型吧:

# ./app/models/browser.rb 

class Browser 

    def initialize(agent) 
    @agent = agent 
    end 

    def ie7? 
    @agent =~ /msie 7.0/i 
    end 

end 

一个伟大的答案是使用现有的宝石,提供你想要的东西:https://github.com/fnando/browser

gem install browser 
... 
browser.ie7? 
+0

很酷的解决方案,如果您打算根据浏览器进行大量有条件的工作,绝对是您的选择。向'ApplicationController'添加一个'before_filter'来执行如下操作:'@browser = Browser.new(request)',然后更新Browser的'initialize'以获取'request'对象的相关部分并将它们转换为属性。 – bricker

+0

非常感谢!你=>真棒 – jahrichie