Показать флэш-сообщение с проверкой модели

У меня есть следующие проверки модели...

  validates :event_id, :uniqueness => {:scope => :email}
  validates_format_of :email, :with => /\A[^@]+@([^@\.]+\.)+[^@\.]+\z/
  validates_presence_of :email, :first_name, :last_name

..и вот мой контроллер...

def register_learner
    @event = Event.find(params[:event_id])
    begin
      EventRegistration.create! first_name: params[:first_name], last_name: params[:last_name], email: params[:email], event_id: params[:event_id]
      rescue ActiveRecord::RecordInvalid => e
    end
end

Эти коды работают, но проблема в том, что они молча перехватывают ошибки. Я хотел бы отобразить флэш-сообщение пользователю и на текущей странице. Итак, я попробовал это...

   def register_learner
    @event = Event.find(params[:event_id])
    begin
      @registation = EventRegistration.create! first_name: params[:first_name], last_name: params[:last_name], email: params[:email], event_id: params[:event_id]
      rescue ActiveRecord::RecordInvalid => e
      if [email protected]?
        flash[:notice] = @registation.errors
      end
    end
   end

... но я получаю сообщение undefined method `valid?' for nil:NilClass, если проверка не удалась.


person Mark Locklear    schedule 04.08.2015    source источник


Ответы (2)


Если вы используете new вместо create!, вы получите экземпляр, который может сказать вам valid? == false.

Вам также не понадобится помощь в этом случае.

Итак, вы можете сделать что-то вроде этого:

def register_learner
  @event = Event.find(params[:event_id])
  @registation = EventRegistration.new(
    first_name: params[:first_name], 
    last_name: params[:last_name], 
    email: params[:email], 
    event_id: params[:event_id]
  )
  flash[:notice] = @registation.errors unless @registation.valid?
end

Кроме того, если у вас уже может быть существующая регистрация, вы можете использовать find_or_initialize_by, а затем проверить, является ли полученный объект новой записью с помощью @registration.new_record?.

person chad_    schedule 04.08.2015

Спасибо, чад_. Это был билет. Для полного решения вот что я сделал...

def register_learner
    @event = Event.find(params[:event_id])
    @registation = EventRegistration.new first_name: params[:first_name], last_name: params[:last_name], email: params[:email], event_id: params[:event_id]
    if [email protected]?
      flash[:notice] = @registation.errors.full_messages.to_sentence
      redirect_to(event_path(@event))
    else
      @registation.save
    end
end
person Mark Locklear    schedule 04.08.2015
comment
Без проблем. Вы пропустили end. ;) - person chad_; 04.08.2015