显示带有模型验证的 flash 消息

Display flash message with model validations

我有以下模型验证...

  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 !@registation.valid?
        flash[:notice] = @registation.errors
      end
    end
   end

...但如果验证失败,我会收到消息 undefined method `valid?' for nil:NilClass

如果您使用 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? 的新记录。

谢谢查德_。那是门票。对于完整的解决方案,我就是这样做的...

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 !@registation.valid?
      flash[:notice] = @registation.errors.full_messages.to_sentence
      redirect_to(event_path(@event))
    else
      @registation.save
    end
end