显示带有模型验证的 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
我有以下模型验证...
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