1

我有一个Room模型可以验证它的房间号是唯一的。但是,当用户创建一个新Room实例时,如果他们尝试创建一个已经存在的房间,而不是显示标准这个房间已经存在错误消息,我想提供一个指向该房间的链接,以便他们可以编辑它. 例如:我希望错误消息说:房间 x 已经存在。单击此处编辑该房间。其中 Click Here 文本是指向该房间对象的编辑路径的链接。

在 Rails 中有没有办法做到这一点或类似的东西?任何建议将不胜感激!

4

1 回答 1

1

您可以使用 client_side_validations gem https://github.com/bcardarella/client_side_validations在 javascript 中使用您的 ruby​​ 验证(如果您使用的是 jquery),如 railscast #263 http://railscasts.com/episodes/263-中所示客户端验证

您可以创建一个自定义验证器,它会找到现有的 room_id 并将指向它的链接传递给返回到您的视图的错误消息,例如:

# lib/room_existence_validator.rb
class RoomExistenceValidator < ActiveModel::EachValidator
  def validate_each(object, attribute, value)
    if existing_room = Room.find_by_id(value)
      # unfortunately url_for helper is not defined here so it's hard-wired
      room_link = "/rooms/#{existing_room.id}/edit"
      object.errors[attribute] << "#{link_to "Click here", room_link} to edit that room"
    end
  end
end

您需要将 :validates => true 部分添加到您的 form_for 助手调用中。现在它可以在没有 ajaxified 调用的情况下工作。

要使其与 ajax 一起使用,还有 2 件事要做:

a) 添加一个 rails.validations.custom.js 文件,看起来像这样:

# rails.validations.custom.js
# please beware the .remote in function-name
ClientSideValidations.validators.remote['existing_room'] = function(element, options) {
  if ($.ajax({
    url: '/validators/existing_room',
    data: { id: element.val() },
    // async *must* be false
    async: false
  }).status == 404) { return options.message; }
}

b) 路由您的验证请求,例如通过添加一个响应您的验证器路由的机架中间件,如 client_side_validations wiki https://github.com/bcardarella/client_side_validations/wiki/Custom-Validators中所述

希望有帮助:D

于 2012-06-24T03:25:12.513 回答