我有一个Room
模型可以验证它的房间号是唯一的。但是,当用户创建一个新Room
实例时,如果他们尝试创建一个已经存在的房间,而不是显示标准这个房间已经存在错误消息,我想提供一个指向该房间的链接,以便他们可以编辑它. 例如:我希望错误消息说:房间 x 已经存在。单击此处编辑该房间。其中 Click Here 文本是指向该房间对象的编辑路径的链接。
在 Rails 中有没有办法做到这一点或类似的东西?任何建议将不胜感激!
我有一个Room
模型可以验证它的房间号是唯一的。但是,当用户创建一个新Room
实例时,如果他们尝试创建一个已经存在的房间,而不是显示标准这个房间已经存在错误消息,我想提供一个指向该房间的链接,以便他们可以编辑它. 例如:我希望错误消息说:房间 x 已经存在。单击此处编辑该房间。其中 Click Here 文本是指向该房间对象的编辑路径的链接。
在 Rails 中有没有办法做到这一点或类似的东西?任何建议将不胜感激!
您可以使用 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