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

时间:2012-10-01 02:20:49

标签: ruby-on-rails ruby user-agent

如果客户是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 %>

3 个答案:

答案 0 :(得分:2)

通常在帮助程序中,如果您希望灵活使用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

一个很好的答案是使用提供所需内容的现有gem:https://github.com/fnando/browser

 gem install browser
 ...
 browser.ie7? 

答案 1 :(得分:1)

最好让浏览器嗅探客户端。但是,如果您真的必须在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

答案 2 :(得分:0)

我认为这个代码在布局中应该没问题。您已经将大部分逻辑抽象为函数。在布局中使用它可以允许您从控制器渲染此布局。

这也可能位于视图文件中,但如果您需要在多个页面中使用,则必须为多个视图文件复制相同的代码。或者使用content_for

将其插入所需的页面