仅更新存在的参数 rails

Update only params that exist rails

我知道我可以做这样的事情:

@object.update_attributes(date: params[:date]) if params[:date].present?
@object.update_attributes(date: params[:name]) if params[:name].present?
@object.update_attributes(date: params[:thing]) if params[:thing].present?
@object.update_attributes(date: params[:item]) if params[:item].present?

但是有没有办法一次完成所有这些? 类似于:

@object.update_attributes(object_params)

如果空值不是通过 url 传入的,它不会将空值放入我的数据库中。所以我可以打电话 Object.update(date: Date.today, name: "ryan") 它只会更新这些项目。

你可以试试这个

@object.update_attributes(params)

此外,最好使用强参数,将其放在控制器的末尾

  private

    def object_params
      params.require(:object).permit(:date, :name, :item, :thing)
    end
  end

并将其用作

@object.update_attributes(object_params)

只需 select params,它们不在您的控制器中 nil,照常使用 @object.update_attributes(object_params)

def object_params
  params.require(:object).permit(:date, :name, :thing, :item).select { |k, v| !v.nil? }
end

试试这个:

keys = [:date, :name, :item, :thing]
object_params = params.slice(*keys).delete_if { |k,v| v.nil? }
@object.update_attributes(object_params)

如果参数键与模型列匹配,您也可以这样做:

object_params = params.slice(*Model.column_names).delete_if { |k,v| v.nil? }
@object.update_attributes(object_params)