Ruby on rails 为什么删除不适用于完整消息功能?

Ruby on rails 为什么删除不适用于完整消息功能?,ruby-on-rails,ruby-on-rails-3,validation,Ruby On Rails,Ruby On Rails 3,Validation,我有以下代码: 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?

我有以下代码:

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?
    @registation.errors.full_messages.delete("Event has already been taken"
    flash[:notice] = @registation.errors.full_messages.to_sentence
    redirect_to(event_path(@event))
  else
    @registation.save
  end
end
请注意,@registration.errors.full_messages.deleteEvent行已经在我试图从full_messages数组中删除此特定消息的地方出现,但是它不起作用。下一行是flash消息,消息Event has have have befored仍在显示

这是一个通过控制台进行的正常检查

2.1.5 :001 > errors = ["Event has already been taken", "Last name can't be blank"]
 => ["Event has already been taken", "Last name can't be blank"]
2.1.5 :002 > errors.delete "Event has already been taken"
 => "Event has already been taken"
2.1.5 :003 > errors
 => ["Last name can't be blank"]
我遗漏了什么?

这是因为完整消息是一种方法,每次调用它时都会生成一个新数组。要想做你想做的事:

errors = @registation.errors.full_messages
errors.delete("Event has already been taken")
flash[:notice] = errors.to_sentence
这就回答了问题,现在有一个问题——你为什么需要这样做?也许有更好的办法

一般来说,依赖字符串通常不是一个好主意,假设半年后您需要更改此验证的错误消息。你能百分之百确定你也会记得在这里更改吗?如果没有,您就有一个bug。

这是因为完整消息是一种方法,每次调用它时都会生成一个新数组。要想做你想做的事:

errors = @registation.errors.full_messages
errors.delete("Event has already been taken")
flash[:notice] = errors.to_sentence
这就回答了问题,现在有一个问题——你为什么需要这样做?也许有更好的办法


一般来说,依赖字符串通常不是一个好主意,假设半年后您需要更改此验证的错误消息。你能百分之百确定你也会记得在这里更改吗?如果没有,您就有一个bug。

好吧,因为Rails每次调用该方法时都会使用错误重新创建完整的\u消息:

def full_messages(options = {})
  @errors.values.inject([]) do |full_messages, errors|
    full_messages + errors.map { |error| error.full_message }
  end
end
您可以使用“选择”跳过该消息:

@registation.errors.full_messages.select{|x| x != "Event has already been taken"}.to_sentence
此外,您还可以对errors.messages not full_messages使用delete,因为它们是基础对象的公开属性,而不是副本,与full_messages一样:

@registration.errors.messages[:event].delete('has already been taken')

因为Rails在每次调用该方法时都会使用错误重新创建完整的_消息:

def full_messages(options = {})
  @errors.values.inject([]) do |full_messages, errors|
    full_messages + errors.map { |error| error.full_message }
  end
end
您可以使用“选择”跳过该消息:

@registation.errors.full_messages.select{|x| x != "Event has already been taken"}.to_sentence
此外,您还可以对errors.messages not full_messages使用delete,因为它们是基础对象的公开属性,而不是副本,与full_messages一样:

@registration.errors.messages[:event].delete('has already been taken')

谢谢兄弟。是的,我同意它不可靠。这是一个特定的请求,我们希望验证保持数据库干净,但我们不想抛出错误消息。谢谢兄弟。是的,我同意它不可靠。这是一个特定的请求,我们希望验证保持数据库干净,但不希望抛出错误消息。