How to: Set a datetime params-value to nil in the controller

Hi there,

Suppose I submit an object called "task" from a form with...

  task[enddate(1i)] -> 2011   task[enddate(2i)] -> 3   task[enddate(3i)] -> 1

...how do I set the value 'params[:task][:enddate]' to 'nil' in the controller?

I tried...

  params[:task][:enddate] = nil

...but that doesn't seem to "empty" the attribute 'enddate'. What am I getting wrong?

Thanks for your help! Tom

It is difficult to see how that line could not set params[:task][:enddate] to nil, assuming it did not generate an error such as it would if params[:task] were nil. Are you sure it is executing that line of code? You could break in at that point using ruby-debug and check. See the rails guide on debugging for how to do it (google rails guides).

Colin

...how do I set the value 'params[:task][:enddate]' to 'nil' in the controller?

I tried...

params[:task][:enddate] = nil

...but that doesn't seem to "empty" the attribute 'enddate'. What am I getting wrong?

If it doesn't "empty" (whatever you mean by that) the :enddate entry, what *does* it do?

I've just had a play in the console, and it all seems to work as expected:

params = {:task => {:enddate => Date.today.to_s}}

=> {:task=>{:enddate=>"2010-04-22"}}

params[:task][:enddate]

=> "2010-04-22"

params[:task][:enddate] = nil

=> nil

params

=> {:task=>{:enddate=>nil}}

params[:task][:enddate]

=> nil

Thanks for your inputs.

Unfortunately, I can add that:

1. Yes, the code definitely GETS executed 2. No, params[:task] is definitely NOT nil 2. Other values of the Task object in params CAN be set to nil, for example...

   params[:task][:name] = nil

...works correctly.

Could it be that "...[:enddate]" is not sufficient in...

  params[:task][:enddate]

...because the date gets submitted by a date_select? When I check what values get passed to params, I see...

  task[enddate(1i)] -> 2011   task[enddate(2i)] -> 3   task[enddate(3i)] -> 1

Could it be that the problem stems from the "(1i), (2i), (3i)" part?

Any ideas?

Well yes, quite likely. So when you said that params[:task][:enddate] was not getting set to nil, did you actually mean that the date in the database when you save it is not cleared? It looks like it might be an idea to clear the three values in params that are used for setting the date. If you are not sure of the format then use ruby-debug to break in, then you can inspect params and see exactly what is there so you can clear it.

Colin

...because the date gets submitted by a date_select? When I check what values get passed to params, I see...

task[enddate(1i)] -> 2011 task[enddate(2i)] -> 3 task[enddate(3i)] -> 1

Could it be that the problem stems from the "(1i), (2i), (3i)" part?

Any ideas?

Unless i've misunderstood what you are attempting, you need to clear out the 3 parts of end date. You can't remove params[:task][:enddate] because it doesn't exist - when activerecord sees parameters with the appropriate naming convention it gathers them together to create an instance of Time and assigns that to the task's enddate. If you want to set enddate to nil it would probably be enough to remove those 3 parts and then set params[:task][:enddate] to nil (although why jump through all those hoops and not just do some_task.enddate = nil ?)

Fred

Thanks for the explanations - they helped!