Evaluating nil


I have done a drop down menu (collection_select) were I included a
blank space. Then in my controller I want it to evaluate if the chosen
drop down option is nil. I do this and keep getting errors:

if @category.parent_id.nil?
     @category.parent_id = "0"

Is it a syntax problem or something else?


Hi --

i get the following error:

Mysql::Error: Column 'parent_id' cannot be null: INSERT INTO
categories (`name`, `description`, `parent_id`, `created_at`)
VALUES('adfadfadfasdf', 'adsfasdfasdfasdf', NULL, '2007-10-16



Hi --

i get the following error:

Mysql::Error: Column 'parent_id' cannot be null: INSERT INTO
categories (`name`, `description`, `parent_id`, `created_at`)
VALUES('adfadfadfasdf', 'adsfasdfasdfasdf', NULL, '2007-10-16

The error is that column 'parent_id' cannot be null :slight_smile:

It's strictly a database thing. Your database has a constraint that
this column can't be null, so when you do:

   @category = Category.create(params[:category]) # or whatever

it bombs if params[:category] is nil, because that gets inserted into
the database as NULL.

You have a couple of choices. If you want to (or need to) keep the
constraint, then you either need to test for nil and take corrective
action, or rescue from the Mysql::Error. Another approach is to allow
the NULL in the database, but put an application-level validation in
the model that ensures that every category has a parent.

How much data-checking to do at the database level, and how much at
the application level (i.e., before database assertion is even
attempted), is very dependent on lots of factors, some of them
organization (e.g., who has access to the database?). So you can't
just make the decision for this one example; it needs to be thought
through carefully. But anyway, that's the general area of the issue.


I was actually doing the validation in the controller not the model,
here is the complete method in the controller:

def create
    @categories = Category.find(:all, :conditions => ["parent_id = ?",
     if request.post?
     @category = Category.create(params[:category])
        if @category.parent_id.nil?
           @category.parent_id = "0"
      if @category.save
        redirect_to :action => "categories"

All I tried to do was check if it was nil, assign a 0 so that it would
be considered a parent_id=0 which would be a main category. What I
don't understand is why would it find an error if there are two
options only. It either chooses a category from the drop down (which
gives it a parent id of the main category) or the user leaves it
blank, thus the evaluation would add a cero, signifying it is a
parent.as you suggested the software side is much cleaner than the
databse side.

What could be wrong with the code? Why is it still sending a null if I
am specifying to add a "0" if it is nil?

(I really appreciate all you guy's help...i am a newbie at programing)



Shouldn't this be:
        @category = Category.new(params[:category])

you're trying to save it before fixing it up.

But this might best be accomplished in the model with something like a
before_save callback

holy snikies...it worked!!!!

i thought the errror was in the evaluation. and it was in the .create

thanks a lot!!!!

The stack trace will show the file and line number in your code where
the error is coming from, so you need to learn how to read those (you
may have to look through the trace until you get out of the rails code
and into your application's code). You probably would have realized
your problem immediately, or at the least, been able to post the code
including the offending line.

It's very common to assume that an error is coming from one part of
the code when it's actually coming from another. We all have to resist
the temptation to make assumptions like that.

thanks for that tip....i recreated the bug and still get the mysql
error, but just as you said, it shows me the error in the line where
the create messed up in the Application trace.

My question is: which one of the two errors should be taken care of
first when developing, since the trace donse't really say much...in
this case it outputs this(last two lines):

active_record/base.rb:451:in `create'
app/controllers/admin_controller.rb:16:in `create'

Does this mean it could only get till that line? if so, is the error
always in the last line of the trace?



I'll let others talk on other matters, but parent_id is supposed to be
an integer, and you are trying to make it a string. I don't know, but
I suspect strongly that this is a problem.