Forum: Ruby on Rails checking for nil

Posted by Ketema Harris (ketema)
on 2010-02-08 19:53
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
Posted by Marnen Laibow-Koser (marnen)
on 2010-02-08 20:11
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,
-- 
Marnen Laibow-Koser
http://www.marnen.org
marnen@marnen.org
Posted by bill walton (Guest)
on 2010-02-08 20:13
(Received via mailing list)
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 Harris 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
Posted by Aldric Giacomoni (trevoke)
on 2010-02-08 20:13
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.
Posted by Rob Biedenharn (Guest)
on 2010-02-08 20:54
(Received via mailing list)
On Feb 8, 2010, at 2:13 PM, Aldric Giacomoni 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
Posted by Ketema Harris (ketema)
on 2010-02-08 21:19
Rob Biedenharn wrote:
> On Feb 8, 2010, at 2:13 PM, Aldric Giacomoni 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
Posted by Greg Donald (destiney)
on 2010-02-08 23:10
(Received via mailing list)
On Mon, Feb 8, 2010 at 12:53 PM, Ketema Harris <lists@ruby-forum.com> 
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 Donald
destiney.com | gregdonald.com
Posted by Matt Jones (Guest)
on 2010-02-09 17:08
(Received via mailing list)
On Feb 8, 2:52 pm, Rob Biedenharn <R...@AgileConsultingLLC.com> 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:

http://msdn.microsoft.com/en-us/library/ms537512(VS.85).aspx

--Matt Jones
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.