Rails form POSTing NULL values

Hello All,

Several of my Rails apps on a server broke all at once. Specifically,
any forms that POST no longer work; NULL values are being submitted
instead of the form parameters. I've checked with Firebug that the
forms themselves are sending the values but the "create" action in all
my controllers does not seem to be picking up the form values. I was
hoping somebody could help me troubleshoot. These apps were all
working at some point but just broke all of a sudden. I've asked my
hosting provider if they changed anything but they claim no. Below
are my environment details as well as model, view, controller and
relevant development.log entries.

I appreciate any help!

#--guest_book.html.erb (view)
<% form_for(Comment.new) do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name, 'Name:' %><br />
    <%= f.text_field :name, :class => 'required' %>
  </p>
  <p>
    <%= f.label :body, 'Message:' %><br />
    <%= f.text_area :body, :class => 'required' %>
  </p>
  <p>
    <%= f.submit "Submit" %>
  </p>
<% end %>

#--comments_controller.rb (controller)
# GET /comments/new
# GET /comments/new.xml
def new
  @comment = Comment.new

  respond_to do |format|
    format.html # new.html.erb
    format.xml { render :xml => @comment }
  end
end

# POST /comments
# POST /comments.xml
def create
  @comment = Comment.new(params[:comment])

  @comment.approved = '1'
  @comment.ip_address = request.remote_ip

  geo = GeoIP.new("#{RAILS_ROOT}/app/geoip/GeoLiteCity.dat")
  g = geo.city(request.remote_ip)
  @comment.city = g[7]
  @comment.state = g[6]
  @comment.country = g[4]

  logger.debug "New comment: #{@comment.attributes.inspect}"
  logger.debug "Comment should be valid: #{@comment.valid?}"
  logger.debug "NEW FORM SUBMISSION: #{params.inspect}"
  logger.debug "RAW POST: #{request.raw_post}"

  respond_to do |format|
    if @comment.save
      flash[:notice] = "Thank you #{@comment.name} for signing our
Guest Book!"
      #EmailNotifications.deliver_new_comment_added(@comment)
      format.html { redirect_to(:back) }
      format.xml { render :xml => @comment, :status
=> :created, :location => @comment }
    else
      format.html { render :action => "new" }
      format.xml { render :xml => @comment.errors, :status
=> :unprocessable_entity }
    end
  end
end

#--comment.rb (Model)
class Comment < ActiveRecord::Base
end

#--development.log
Processing CommentsController#create (for 76.14.68.221 at 2009-10-28
14:42:53) [POST]
  Parameters: {"comment"=>nil, "commit"=>"Submit",
"authenticity_token"=>"CazFmdyMNnd3i+z0xH2GPgS7yumT0E/rZar0ofLSvSE="}
  e[4;36;1mComment Columns (6.6ms)e[0m e[0;1mSHOW FIELDS FROM
`comments`e[0m
Comment crap
New comment: {"name"=>nil, "city"=>nil, "created_at"=>nil,
"country"=>nil, "body"=>nil, "updated_at"=>nil, "approved"=>nil,
"state"=>nil, "ip_address"=>nil}
Comment should be valid: true
NEW FORM SUBMISSION: {"comment"=>nil, "commit"=>"Submit",
"authenticity_token"=>"CazFmdyMNnd3i+z0xH2GPgS7yumT0E/rZar0ofLSvSE=",
"action"=>"create", "controller"=>"comments"}
RAW POST: authenticity_token=CazFmdyMNnd3i%2Bz0xH2GPgS7yumT0E
%2FrZar0ofLSvSE%3D&comment%5Bname%5D=Hey+Now+Name&comment%5Bbody%5D=Hey
+Now+Message&commit=Submit
  e[4;35;1mSQL (0.8ms)e[0m e[0mBEGINe[0m
  e[4;36;1mComment Create (1.1ms)e[0m e[0;1mINSERT INTO `comments`
(`name`, `city`, `created_at`, `body`, `country`, `updated_at`,
`approved`, `ip_address`, `state`) VALUES(NULL, 'San Francisco',
'2009-10-28 21:42:53', NULL, 'United States', '2009-10-28 21:42:53',
1, '76.14.68.221', 'CA')e[0m
  e[4;35;1mSQL (50.4ms)e[0m e[0mCOMMITe[0m
Redirected to back
Redirected to http://www.example.com/guest-book
Completed in 71ms (DB: 62) | 302 Found [http://www.example.com/
comments]
  e[4;36;1mSQL (0.9ms)e[0m e[0;1mSET NAMES 'utf8'e[0m
  e[4;35;1mSQL (2.5ms)e[0m e[0mSET SQL_AUTO_IS_NULL=0e[0m

#--Environment
Phusion Passenger: 2.2.5

rails -v
Rails 2.3.0

ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]

gem -v
1.3.5

gem list
actionmailer (2.3.0, 2.2.2, 2.1.2, 2.1.1, 2.1.0, 2.0.5, 2.0.2)
actionpack (2.3.0, 2.2.2, 2.1.2, 2.1.1, 2.1.0, 2.0.5, 2.0.2)
actionwebservice (1.2.6, 1.2.3)
activerecord (2.3.0, 2.2.2, 2.1.2, 2.1.1, 2.1.0, 2.0.5, 2.0.2)
activeresource (2.3.0, 2.2.2, 2.1.2, 2.1.1, 2.1.0, 2.0.5, 2.0.2)
activesupport (2.3.2, 2.3.0, 2.2.2, 2.1.2, 2.1.1, 2.1.0, 2.0.5, 2.0.2)
acts_as_taggable (2.0.2, 1.0.4)
ajax_scaffold_generator (3.1.11, 2.2.1)
archive-tar-minitar (0.5.2, 0.5.1)
auth_generator (2.0.1, 1.5.3)
Bloglines4R (0.1.0)
BlueCloth (1.0.0)
builder (2.1.2, 2.0.0)
camping (1.5)
capistrano (2.5.1, 2.1.0, 1.4.1)
classifier (1.3.1)
cmdparse (2.0.2, 2.0.0)
curb (0.1.4)
daemons (1.0.9)
facets (2.2.1, 1.8.54)
fastthread (1.0.1)
feedtools (0.2.29, 0.2.28)
ferret (0.11.6, 0.11.4)
flickr (1.0.2)
gd2 (1.1.1, 1.1)
gen (0.41.0)
geoip (0.8.1, 0.6.1)
geokit (1.4.1)
gettext (1.90.0)
glue (0.41.0)
gnuplot (2.2)
gravtastic (2.0.0)
gruff (0.3.1)
haml (2.0.3)
hoe (1.5.1)
hpricot (0.6)
htmltools (1.10)
localization_generator (1.0.8)
login_generator (1.2.2)
madeleine (0.7.3)
mechanize (0.7.6)
mini_magick (1.2.3)
mysql (2.7)
needle (1.3.0)
net-sftp (1.1.1)
net-ssh (1.1.2)
nitro (0.41.0)
og (0.41.0)
packet (0.1.14)
PageTemplate (2.2.0)
ParseTree (2.1.1)
payment (1.0.1)
pdf-writer (1.1.8)
podcast (0.0.4)
rack (1.0.0, 0.9.1)
radiant (0.6.9)
rails (2.3.0, 2.2.2, 2.1.2, 2.1.1, 2.1.0, 2.0.5, 2.0.2)
rake (0.8.4, 0.8.3, 0.8.2)
RedCloth (3.0.4)
rfacebook (0.9.8)
rmagick (1.15.14)
rspec (1.1.3)
ruby-breakpoint (0.5.1)
ruby-debug (0.10.0)
ruby-yadis (0.3.4)
ruby_odeum (0.4.1)
rubyforge (0.4.5)
RubyInline (3.6.7)
rubyist-aasm (2.0.5)
rubypants (0.2.0)
rubyzip (0.9.1)
ruport (1.6.0)
ruport-util (0.14.0)
ruwiki (0.9.3)
salted_login_generator (2.0.2)
shipping (1.5.1)
SimpleSearch (0.5.0)
sqlite3-ruby (1.2.4, 1.2.1)
stemmer (1.0.1)
switchtower (1.0.1)
syntax (1.0.0)
tagtools (0.0.3)
tidy (1.1.2)
tzinfo (0.3.8)
unicode (0.1)
uuidtools (1.0.3)
webgen (0.4.7)
wee (0.10.0)
xhtmldiff (1.0.0)
xml-simple (1.0.11)
ym4r (0.6.1)
youtube-g (0.4.9.9)

You pasted the code for guest_book.html.erb , yet your controller is
using new.html.erb. Confirm the code you pasted as
guest_book.html.erb is actually for new, or paste the 'new' view.

Hi smeade,

I embedded the comment form on the guestbook view. Comments are just
guestbook entries. So, to confirm, guest_book.html.erb has a comment
form that uses the comments_controller.rb, i.e. I did not mis-paste
the code. The "create" action is where things appear to break.

Any other thoughts? I really appreciate your help.

Hello All,

If anybody else is having this problem, this is how I solved it. I
simply upgraded my Rails installation from 2.3.0 to 2.3.4 and
reinstalled my gems. That seemed to take care of it for some reason.
I also did the following during debugging:

1. I copied the code from production to my local environment (running
2.3.4) and connecting to the remote database, everything worked fine
2. I disabled FastCGI on production (I'm not sure if that helped)
3. I found out that my host (Dreamhost) upgraded Phusion Passenger
from 2.0.6 to 2.2.5 around the time that things broke

It appears that this was an environment issue since things were fine
until the Passenger upgrade.

Here are some other links that I found that were similar to my
problem:
http://railsforum.com/viewtopic.php?id=3186
http://pivotallabs.com/users/amilligan/blog/articles/979-rails-requests-missing-the-http-body

I hope this is helpful to anybody else who was facing a similar
problem.