【发布时间】:2015-08-26 01:49:11
【问题描述】:
假设我有两个模型:客户端和产品
Client的“username”和“email”应该是“唯一索引”,作为Product的“serialnumber”
当用户在唯一索引的表单字段上键入时,我有一个 onblur 函数,它向控制器发送带有属性名称和属性值的请求。如果存在值,则立即通知用户。
在 ClientController 中,我编写了一个函数来检查它是否唯一并返回 -2 表示错误,返回 -1 表示不存在,如果存在则返回正数(id)。
def unique
if params[:attrName].blank? or params[:attrValue].blank?
id = "-2"
else
cli = Client.where("#{params[:attrName]} = '#{params[:attrValue]}'").first
if cli != nil
id = cli["id"]
else
id = "-1"
end
end
render :json => {
:id => id
}
end
这不好有很多原因(SQL注入漏洞,违反DRY,因为每个控制器都会有基本相同的方法。
我正在考虑在 ApplicationController 中编写“唯一”函数,但正如您在上面看到的,如果它是客户端,我应该能够调用“Client.where”,或者如果它是产品,我应该能够调用“Product.where”。如何以最“通用”的方式和最安全的方式构建此功能?我正在考虑原始 SQL,但我认为这是一种幼稚的方法。
【问题讨论】:
-
这是你的目标吗?创建产品时,“用户名”和“电子邮件”组合成“序列号”类型的唯一索引,保存在产品表中。您的愿望是确保如果同一用户尝试创建另一个产品,任何产品,他们将被阻止,因为该用户名和电子邮件之前已用于创建产品。而且您没有使用模型活动记录关系来完成任何此类逻辑。是这样吗?
-
没有。 “用户名”和“电子邮件”与“产品”无关。它们是“唯一索引”属性的示例。这就像当您创建一个电子邮件帐户时,当您键入所需的电子邮件时,您会立即收到关于它是否可用的反馈。这是因为当您键入时,电子邮件字符串会发送到服务器,并检查它是否已存在于数据库中。请阅读@yez 答案,因为它显示了我想要完成的工作
-
好的。谢谢。我只是想知道。
标签: ruby-on-rails ruby ruby-on-rails-4