如何根据 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