Is there a word or phrase for someone who strongly disapproves of smoking, drinking and gambling?
Abstainer, teetotaler, Puritan?
An abstainer is literally one who abstains, typically from some passion or pleasure.
The word teetotaler (nothing to do with "tea") comes from the Temperance Movement of the late 1800s, when people claimed to "t-t-totally abstain" from alcohol. Nowadays, we would say "totally with a capital T", but back then, you would feign a stutter.
The Puritans were a movement of English Protestants who objected to the way the Anglican Church was recreating the hierarchical Roman Church and sought a more personal relationship with God.
Their humane beliefs and passion for education (Harvard was founded as a school for Puritan ministers) have been forgotten, and their preference for plain clothing and their distaste for the theater and public holidays have been unfairly inflated in the public imagination to include a prudish rejection of pleasures like drinking and sex that actual Puritans embraced wholeheartedly.
The historian T.B. Macaulay, who should have known better, wrote, "Puritans disliked bear-baiting not because it gave pain to the bear but because it proffered pleasure to the onlookers." To call someone a "Puritan" today implies a dour joylessness, someone who doesn't drink not because he has to drive but because he might accidentally enjoy himself.
To me, incidentally, the word "puritanical" describes a thought, word, or deed that might be ascribed (even wrongly as we have seen) to a Puritan. An actual human being should be tagged as "Puritan" or "a Puritan".
If you wanted a slightly humorous answer you could make use of "buzzkill"
Noun: (slang) someone or something that stops people from enjoying themselves
However a suitable adjective might be "straitlaced"
- excessively strict in conduct or morality; puritanical; prudish:
I'm not sure if this is in dictionaries (so it might be considered slangy) but it is a term most American-English speakers will be familiar with and means exactly what you're asking for:
straightedge (adj)
The Australian English term for someone like this is: wowser.
In Australian English this is a very insulting term and should be used carefully.
Addition: here's the pronunciation. The BrE version is pretty close to Australian English.
The word that immediately came to my mind is prude.