Because everything that comes back through POST or GET is a string. That’s the way it is in Perl, PHP, Python, Ruby, etc.
As for remove_product, I guess I’d have to see the source of that method, as I don’t recall, unless this is a new feature, methods like ‘remove_’ being generated by belongs_to or has_many. Try @ cart.delete(Product.find(params[:id]). More verbose, but that’s all I can think of right now.