Опираясь на то, что говорили другие, этот путь может быть немного проще, чем продлевать разработку или что-то в этом роде.
Обязательно используйте пустые строки вместо удаления всей строки, в противном случае devise просто вернется к использованию значения по умолчанию для этого сообщения.
# blank out any string you don't want to render as a message
devise:
failure:
already_authenticated: ''
unauthenticated: ''
unconfirmed: ''
...
Теперь devise все равно будет передавать пустую строку в качестве предупреждения. Но теперь это будет выглядеть примерно так: сообщение будет пустой строкой
#<ActionDispatch::Flash::FlashHash:0xa7647c4
@closed=false,
@flashes={:alert=>""},
@now=nil,
@used=#<Set: {:alert}>>
Я использую вспомогательный метод в своем файле ApplicationHelper, который обрабатывает сбор всех сообщений вместе. Вы можете сделать это по-другому, но это даст вам идею.
def all_messages
# Standard flash messages
messages = flash.map{|key,val| {:type=>key, :message=>val} unless val.blank? }.compact
# |-------------------------|
# This is where the magic happens. This is how I ignore any blank messages
# Model validation errors
model = instance_variable_get("@#{controller_name.singularize}")
unless model.nil?
messages += model.errors.full_messages.map do |msg|
{:type=>:error, :message=>msg}
end
end
return messages
end
И вуаля, оператор unless val.blank?
отображает любое пустое значение на nil, а метод .compact
удаляет все значения nil, оставляя вас с чистым скрипучим массивом без пустых сообщений.