Checking for nil

HI, I have inherited support on a rails website and I am encountering
the following problem:

<% if @request.env[‘HTTP_USER_AGENT’].downcase.index(‘msie 6.0’)!=nil %>
<%= stylesheet_link_tag ‘ie6’ %>
<% elsif
@request.env[‘HTTP_USER_AGENT’].downcase.index(‘msie 7.0’)!=nil %>
<%= stylesheet_link_tag ‘ie7’ %>
<% else %>
<%= stylesheet_link_tag ‘moz’ %>
<% end %>
this little code snippet works except when the user agent string is
empty in which case i get : (undefined method `downcase’ for
nil:NilClass)

how can i edit this code so that it can handle an empty user agent
string?

thanks

Ketema H. wrote:

HI, I have inherited support on a rails website and I am encountering
the following problem:

<% if @request.env[‘HTTP_USER_AGENT’].downcase.index(‘msie 6.0’)!=nil %>
<%= stylesheet_link_tag ‘ie6’ %>
<% elsif
@request.env[‘HTTP_USER_AGENT’].downcase.index(‘msie 7.0’)!=nil %>
<%= stylesheet_link_tag ‘ie7’ %>
<% else %>
<%= stylesheet_link_tag ‘moz’ %>
<% end %>
this little code snippet works except when the user agent string is
empty in which case i get : (undefined method `downcase’ for
nil:NilClass)

how can i edit this code so that it can handle an empty user agent
string?

thanks

Introduce a call to nil? . No problem.

And for goodness’ sakes, get this code out of the view file. Logic
doesn’t belong there.

Best,
–Â
Marnen Laibow-Koser
http://www.marnen.org
[email protected]

Hi Katerna,

Rails has a handy helper for this. blank? returns true for false, empty
or whitespace strings. nil is false. You’ll need to move the negation
to the beginning.

On Mon, 2010-02-08 at 19:53 +0100, Ketema H. wrote:

% if @request.env[‘HTTP_USER_AGENT’].downcase.index(‘msie 6.0’)!=nil

if !@request.env[‘HTTP_USER_AGENT’].downcase.index(‘msie 6.0’).blank?

HTH,
Bill

Ketema H. wrote:

HI, I have inherited support on a rails website and I am encountering
the following problem:

<% if @request.env[‘HTTP_USER_AGENT’].downcase.index(‘msie 6.0’)!=nil %>
<%= stylesheet_link_tag ‘ie6’ %>
If the user agent is for IE6…

            <% elsif

@request.env[‘HTTP_USER_AGENT’].downcase.index(‘msie 7.0’)!=nil %>
<%= stylesheet_link_tag ‘ie7’ %>
If the user agent is for IE7…

            <% else %>
              <%= stylesheet_link_tag 'moz' %>

If the user agent is anything else, including empty …

            <% end %>

this little code snippet works except when the user agent string is
empty in which case i get : (undefined method `downcase’ for
nil:NilClass)

how can i edit this code so that it can handle an empty user agent
string?

Ah, I see. You want ‘nil’ … So you should first say that :
if @request.env[‘HTTP_USER_AGENT’].nil?
… And then whatever you want to do.

On Feb 8, 2010, at 2:13 PM, Aldric G. wrote:

@request.env[‘HTTP_USER_AGENT’].downcase.index(‘msie 7.0’)!=nil %>
nil:NilClass)

how can i edit this code so that it can handle an empty user agent
string?

Ah, I see. You want ‘nil’ … So you should first say that :
if @request.env[‘HTTP_USER_AGENT’].nil?
… And then whatever you want to do.

Start with something like:

user_agent = @request.env.fetch(‘HTTP_USER_AGENT’, ‘empty’).downcase

Then replace all the other tests:

if user_agent.index(‘msie 6.0’)

There’s no need to say !=nil

(but I agree that you should get the logic out of the view if
possible. Perhaps in a helper?

def user_agent
@request.env.fetch(‘HTTP_USER_AGENT’, ‘empty’).downcase
end

def browser_specific_stylesheet
case user_agent
when /msie 6.0/
‘ie6’
when /msie 7.0/
‘ie7’
else
‘moz’
end
end

<%= stylesheet_tag browser_specific_stylesheet %>

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

Rob B. wrote:

On Feb 8, 2010, at 2:13 PM, Aldric G. wrote:

@request.env[‘HTTP_USER_AGENT’].downcase.index(‘msie 7.0’)!=nil %>
nil:NilClass)

how can i edit this code so that it can handle an empty user agent
string?

Ah, I see. You want ‘nil’ … So you should first say that :
if @request.env[‘HTTP_USER_AGENT’].nil?
… And then whatever you want to do.

Start with something like:

user_agent = @request.env.fetch(‘HTTP_USER_AGENT’, ‘empty’).downcase

Then replace all the other tests:

if user_agent.index(‘msie 6.0’)

There’s no need to say !=nil

(but I agree that you should get the logic out of the view if
possible. Perhaps in a helper?

def user_agent
@request.env.fetch(‘HTTP_USER_AGENT’, ‘empty’).downcase
end

def browser_specific_stylesheet
case user_agent
when /msie 6.0/
‘ie6’
when /msie 7.0/
‘ie7’
else
‘moz’
end
end

<%= stylesheet_tag browser_specific_stylesheet %>

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

thanks for all the replies! i got a check to work for all cases:

<% if !@request.env[‘HTTP_USER_AGENT’].nil?
if
@request.env[‘HTTP_USER_AGENT’].downcase.index(‘msie 6.0’)!=nil %>
<%= stylesheet_link_tag ‘ie6’ %>
<% elsif
@request.env[‘HTTP_USER_AGENT’].downcase.index(‘msie 7.0’)!=nil %>
<%= stylesheet_link_tag ‘ie7’ %>
<% else %>
<%= stylesheet_link_tag ‘moz’ %>
<% end %>
<% end %>
not the prettiest code, but its working and no more error

thanks again

On Feb 8, 2:52 pm, Rob B. [email protected] wrote:

(but I agree that you should get the logic out of the view if
possible. Perhaps in a helper?

He should get the logic out of the app entirely. This is the exact
use case for IE’s conditional comments:

–Matt J.

On Mon, Feb 8, 2010 at 12:53 PM, Ketema H. [email protected]
wrote:

           <% end %>

this little code snippet works except when the user agent string is
empty in which case i get : (undefined method `downcase’ for
nil:NilClass)

how can i edit this code so that it can handle an empty user agent
string?

@agent = @request.env[‘HTTP_USER_AGENT’] rescue nil

<% if @agent -%>

<% end -%>


Greg D.
destiney.com | gregdonald.com