Dobra. To jeszcze raz. Jak odwołujesz się do params[:messages], a taki klucz nie istnieje, to zwraca Ci “nil”. Przekazujesz to do Messages.new. Stąd Twój “if” jest nie potrzebny bo Messages.new dostanie te same dane i bez if’a (dostanie albo nil, albo zawartość params[:messages]).
Co do each’a to musiałbyś wrzucić plik widoku gdzie wywala Ci błąd, ale na 100% jest to nie zależne od tego.
Flash Ci działa, ale pewnie jak robisz refresh.
Nie masz racji. Ta klasa nie dziedziczy po ActiveRecord::Base, ma własną metodę initialize:
def initialize(attributes = {})
attributes.each do |name, value|
send("#{name}=", value)
end
end
więc jak widzisz jest duża różnica czy wyślesz nil czy nie przekażesz parametru.