2015-08-04 9 views
1

У меня есть следующие модели валидация ...Дисплей флэш-сообщение с моделью валидаций

validates :event_id, :uniqueness => {:scope => :email} 
    validates_format_of :email, :with => /\A[^@][email protected]([^@\.]+\.)+[^@\.]+\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 если проверка не пройдена.

ответ

1

Если вы используете 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?.

1

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

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 
+1

Нет проблем. Вы пропустили «конец». ;) –