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

@agent = @request.env['HTTP_USER_AGENT'] rescue nil

<% if @agent -%> ... <% end -%>

Ketema Harris 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,

Ketema Harris 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.

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.

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 Biedenharn http://agileconsultingllc.com Rob@AgileConsultingLLC.com

Rob Biedenharn 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 Biedenharn http://agileconsultingllc.com Rob@AgileConsultingLLC.com

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

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

--Matt Jones