Testing for non-existent parameters with "if"

Rails gives me an error when I test for a blank param like this:

    if params[:post][:id]
      @comment.commentable = Post.find(params[:post][:id])
    elsif params[:event][:id]
      @comment.commentable = Event.find(params[:event][:id])
    end

If I have params[:post][:id], things are fine. But if I have
params[:event][:id] instead, I get this error:

You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]

Rails dies when it checks for the non-existent params[:post][:id]. I
will always send either :event or :post, but never both. How can I use
“if - elsif” to test for this without crashing? Thanks!

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi Taylor,

On 3-Mar-07, at 11:09 PM, Taylor S. wrote:

You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]

Rails dies when it checks for the non-existent params[:post][:id]. I
will always send either :event or :post, but never both. How can I
use
“if - elsif” to test for this without crashing? Thanks!

If the params[:post] hash is non-existent, then checking within it
to see if there’s an :id value is probably what’s throwing that error.

To avoid this problem you’d want to do something like:

if params[:post] && params[:post][:id]
@comment.commentable = Post.find(params[:post][:id])
elsif params[:event] && params[:event][:id]
@comment.commentable = Event.find(params[:event][:id])
end

Or you could do something like this:

if id = params[:post][:id] rescue nil
@comment.commentable = Post.find(id)
elsif id = params[:event][:id] rescue nil
@comment.commentable = Event.find(id)
end


Thanks,

Dan


Dan K.
Autopilot Marketing Inc.

Email: [email protected]
Phone: 1 (604) 820-0212
Web: http://autopilotmarketing.com/
vCard: http://autopilotmarketing.com/~dan.kubb/vcard


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.2 (Darwin)

iD8DBQFF6nWO4DfZD7OEWk0RAhpXAJsH0ZYbp1Rt5aNZEIUtTa7Z8q9d3ACdHwdm
X6whYvFwH02fEBYi1zMF1v0=
=KFsJ
-----END PGP SIGNATURE-----

Taylor S. wrote:

You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]

Rails dies when it checks for the non-existent params[:post][:id]. I
will always send either :event or :post, but never both. How can I use
“if - elsif” to test for this without crashing? Thanks!

It depends on what is nil, i.e. params[:post] or params[:post][:id] but
you can do something like:

if params[:post].has_key?(:id)

or

if not params[:post][:id] == nil


Michael W.

Rails gives me an error when I test for a blank param like this:

    if params[:post][:id]

If I have params[:post][:id], things are fine. But if I have
params[:event][:id] instead, I get this error:
And a third solution yet
if defined? params[:post][:id]
else
end

It will not always work if you use it from a view (because of how local
variables are handled), but for Models, Controllers and the sort it
should be fine.

regards,
javier ramirez


Estamos de estreno… si necesitas llevar el control de tus gastos
visita http://www.gastosgem.com !!Es gratis!!

Thanks to all - these solutions worked. I ended up using “if
params[:post] && params[:post][:id]”