当我们只更新一个属性时,我们是否应该使用强参数?

7 浏览
0 Comments

当我们只更新一个属性时,我们是否应该使用强参数?

我正在开发一个Rails应用程序,其中我有几个动作(#delete_later,#ban_later等),在这些动作中,我只从请求参数中设置一个属性(具体来说,是一个名为reason的字段)。\n我想知道是否可以这样做:\n

def ban_later
  @object.reason = params[:object][:reason]
  @object.save
end

\n或者在这种情况下使用strong params是否是最佳实践?\n

def ban_later
  @object.reason = object_params[:reason]
  @object.save
end
private
  def object_params
    params.require(:object).permit(:permitted_1, :permitted_2, :reason)
  end

\n这些解决方案中哪个是最好的?如果没有一个是最好的,那么对于我的问题,最佳解决方案是什么?\n后来编辑:\n#ban_later,#delete_later动作确实可以设置一个标志列status,但这可以在不从params哈希接收其值的情况下完成。由于每个方法只设置一个状态,您可以在#delete_later时简单地设置状态为“pending_delete”,在#ban_later时设置状态为“pending_ban”。\n再后来编辑\n为什么使用#save而不是直接使用update_attributes?假设您需要有一个if @object.save语句。在假分支(对象未保存)中,您可能仍然希望渲染一个视图,其中使用了@object的内容。

0
0 Comments

问题的出现的原因:

开发人员在更新单个属性时,可能会考虑使用update_attributes方法。然而,这种方法会触发验证,而有时我们只想更新单个属性而不进行验证。

解决方法:

一种解决方法是使用update_attribute方法,该方法不会触发验证。另一种解决方法是使用update选项来更新属性。这样可以绕过验证,但要注意安全性问题。

总之,为了保持应用程序的灵活性和可扩展性,我们需要遵循strong params的设置。这样可以确保只接受特定的参数,并提高应用程序的安全性。

其他答案还提供了一些关于mass-assignment等方面的建议。最后,我们需要根据具体需求选择合适的方法。

0
0 Comments

当我们只更新一个属性时,是否应该使用 strong_params 的原因是为了确保参数的一致性和安全性。如果我们只在某个方法中使用一个参数,并且不将其传递给多属性的 setter 方法,那么我们不需要使用 strong_params 来获得安全的解决方案。但是,在整个控制器中,这种情况可能不太可能发生。在某些情况下,我们的控制器方法可能需要更多的参数。在这种情况下,问题就变成了:“您是否希望在 ban_later 方法中与其他控制器方法处理 params 的方式不同?”此外,我们是否能确保功能不会改变,并且在更改功能时,我们会记得改变 params 的处理方式。因此,我建议使用 strong_params,因为它意味着:

- 在控制器的所有方法中,参数的处理方式是一致的。

- 在功能更改时,方法的更改不太可能暴露漏洞。

在 ban_later 和 delete_later 方法中,我们只需要设置一个状态,可以直接设置状态而不需要从 params 哈希中接收其值。由于每个方法只会设置一个状态,您可以在 delete_later 方法中设置状态为 "pending_delete",在 ban_later 方法中设置状态为 "pending_ban"。正如您所看到的,我们不需要从用户处获取任何参数,除非是针对某个特定操作的原因。您是正确的,您不必使用 strong_params。但是出于我提出的原因,我会选择使用它。

0
0 Comments

当我们只更新一个属性时,是否应该使用 strong params?

问题的出现原因是我们需要在更新模型时选择使用哪种参数验证方法。第一种方法可以节省计算资源,而第二种方法可以提高容错能力。最初,我倾向于选择第一种方法,但经过一番思考后,我更喜欢第二种方法。

解决方法是使用 strong params 来验证参数。下面是使用 strong params 的示例代码:

def update_params
  params.require(:object).permit(:attribute)
end

这样,我们可以在更新模型时只允许更新指定的属性,确保参数的安全性和正确性。

0