如何根据 Ruby 键中的选定值验证更新?
How do I validate update based on selected values in a key with Ruby?
我想对键的一组特定值实施条件更新方法。
我只想在原始 list.permissions 值(创建时设置)等于 "public"、"viewable, or "editable 时允许更新。如果 list.permissions 值记录不等于这三个可接受值之一,更新记录被拒绝(锁定)。
我尝试在控制器文件中的私有方法中修改强参数:
def list_params_validated
params.require(:list).permit(:title, permissions: ["public", "viewable", "editable"])
end
然后在同一控制器中的 update
方法中调用它:
def update
list = List.find(params[:id])
if list.update(list_params_validated)
render json: list
else
render json: { errors: list.errors.full_messages }, status: :unprocessable_entity
end
end
运气不好,如有任何帮助,我们将不胜感激!
您可以按如下方式在 List
模型上添加自定义验证,并在控制器中调用简单的 update
。
self.permissions
值应为 string
,如 "public"
或 "viewable"
或 "editable"
。
validate :validate_editable, :validate_permissions:on => :update
def editable?
self.permissions != "locked"
end
private
def validate_editable
errors.add(:base, "Not Ediable!") unless editable?
end
def validate_permissions
unless ["public", "viewable", "editable"].include?(self.permissions)
errors.add(:base, "Permission denied!")
end
end
您可以在控制器上简单地执行此操作
def list_params_validated
params.require(:list).permit(:title, :permissions)
end
在您的模型中只需添加这个
validates_inclusion_of :permissions, in: %w(public viewable editable), :on => :update, :message => "value %s is invalid!"
编辑 1
为了防止更新记录,您应该在模型中添加 before_update 回调作为
before_update :locked?
def locked?
return false if YourModel.find(id).persmissions == 'locked'
true
end
我想对键的一组特定值实施条件更新方法。
我只想在原始 list.permissions 值(创建时设置)等于 "public"、"viewable, or "editable 时允许更新。如果 list.permissions 值记录不等于这三个可接受值之一,更新记录被拒绝(锁定)。
我尝试在控制器文件中的私有方法中修改强参数:
def list_params_validated
params.require(:list).permit(:title, permissions: ["public", "viewable", "editable"])
end
然后在同一控制器中的 update
方法中调用它:
def update
list = List.find(params[:id])
if list.update(list_params_validated)
render json: list
else
render json: { errors: list.errors.full_messages }, status: :unprocessable_entity
end
end
运气不好,如有任何帮助,我们将不胜感激!
您可以按如下方式在 List
模型上添加自定义验证,并在控制器中调用简单的 update
。
self.permissions
值应为 string
,如 "public"
或 "viewable"
或 "editable"
。
validate :validate_editable, :validate_permissions:on => :update
def editable?
self.permissions != "locked"
end
private
def validate_editable
errors.add(:base, "Not Ediable!") unless editable?
end
def validate_permissions
unless ["public", "viewable", "editable"].include?(self.permissions)
errors.add(:base, "Permission denied!")
end
end
您可以在控制器上简单地执行此操作
def list_params_validated
params.require(:list).permit(:title, :permissions)
end
在您的模型中只需添加这个
validates_inclusion_of :permissions, in: %w(public viewable editable), :on => :update, :message => "value %s is invalid!"
编辑 1
为了防止更新记录,您应该在模型中添加 before_update 回调作为
before_update :locked?
def locked?
return false if YourModel.find(id).persmissions == 'locked'
true
end