【发布时间】:2016-01-10 18:22:17
【问题描述】:
我正在开发一个 Rails 应用程序,我有几个操作(#delete_later、#ban_later 等),我只从请求参数中设置一个属性(特别是用于执行该操作的 reason 字段)。
我想知道这样做是否可以:
def ban_later
@object.reason = params[:object][:reason]
@object.save
end
或者即使在这种情况下也使用强参数是一种最佳做法?
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
这些解决方案中哪一个是最好的?如果它们都不是,那么我的问题的最佳解决方案是什么?
后期编辑:
#ban_later、#delete_later 操作确实可以设置标志列status,但这可以在不从 params 哈希中接收其值的情况下完成。由于您只会为每个方法设置一个状态,因此您可以在#delete_later 中设置状态“pending_delete”,在#ban_later 中设置“pending_ban”。
稍后编辑
为什么直接使用#save 而不是update_attributes?假设您需要有一个if @object.save 声明。在错误分支(对象未保存)上,您可能仍希望呈现一个使用 @object 内容的视图。
【问题讨论】:
标签: ruby-on-rails ruby strong-parameters mass-assignment