仅更新存在rails的params

时间:2016-01-20 18:44:21

标签: ruby-on-rails validation params

我知道我可以这样做:

@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"),它只会更新这些项目。

3 个答案:

答案 0 :(得分:1)

你可以试试这个

@object.update_attributes(params)

此外,使用强力参数,将其置于控制器的最后是一个好习惯

  private

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

并将其用作

@object.update_attributes(object_params)

答案 1 :(得分:1)

只需选择控制器中不是params的{​​{1}}并照常使用nil

@object.update_attributes(object_params)

答案 2 :(得分:0)

试试这个:

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)