有条件的用户代理检查需要变干
如果客户端在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
我觉得这段代码在布局上应该没问题。您已经将大部分逻辑抽象为功能。让它在布局中可以让你从控制器渲染这个布局。
这也可能在一个视图文件中,但如果您在多个页面中需要它,您将不得不复制该多个视图文件的相同代码。或者使用content_for
真。我最感兴趣的是一种用于条件检查的方法,因为它不像应该那样。 – 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?
这是我最感兴趣的。编辑你的帖子以在视图中添加(请求)。如果我再次使用它,我会把它放在模型中。感谢大家! – jahrichie
感谢您的编辑。顺便说一下,即使你不把它作为参数从视图中传递出去,request也是可用的,但是这样做会被认为是不好的做法(因为你会依赖一个不可能的变量在那里取决于模块在哪里)。 – bricker
感谢您的帮助!我得到了“错误的参数数量(0代表1)”,这就是为什么我把它作为参数传递的原因。思考? – jahrichie