如何设置控制器参数的默认值?

How can i set the default values of controller parameters?

我的数据库中有一个客户 table 和一个名为 "last_updated_by" 的列。我想在此字段中以纯文本形式添加当前用户名。

我在我的应用程序上安装了设计,所以它给了我 current_user parameter.I 试图将 current_user.name 添加到 customers_controllers 允许的参数,但它没有用。

1-
def customer_params
params.require(:customer).permit(:name, :last_updated_by=>current_user.name)
end

2-
def customer_params
  params[:last_updated_by] = current_user.name
  params.require(:customer).permit(:name, :last_updated_by)
end

3-
def customer_params
  last_updated_by = current_user.name
  params.require(:customer).permit(:name, :last_updated_by=>current_user.name)
end

如何在控制器中设置一些默认值。

如果您需要 last_updated_by 参数进入 customer_params(ActionController::Parameters 的客户哈希键),则:

before_action :set_last_updated_by_param, only: :create

private

def set_last_updated_by_param
  params[:customer][:last_updated_by] = params.dig(:customer, :name)
end

before_action 回调仅在执行创建操作之前在 customer 参数上添加新键 last_updated_by

注意,无需修改 customer_params 即可。


如@JohanWentholt 所示,with_defaults 似乎是最好的方法。加油吧。

等待OP选择正确答案。

如果您仅在请求正文中不存在 params[:last_updated_by] 时才需要默认值,您可以尝试:

def create
  params[:last_updated_by] = params[:last_updated_by].blank? ? 'Default value' : params[:last_updated_by]
  Customer.new(params)
  # finish your controller method
end

def customer_params
  params.require(:customer).permit(:name, :last_updated_by)
end

现在,如果 last_updated_by 为 nil,您需要在每次创建和更新时设置一个默认值,您应该在 Customer 模型上执行此操作:

after_save :set_last_updated_by

def set_last_updated_by
  self.last_updated_by = self.last_updated_by.blank? ? 'Default value' : self.last_updated_by
end

既然你问的是设置默认值,我建议使用 with_defaults method, which is simply an (more expressive) alias for reverse_merge

def customer_params
  params
    .require(:customer)
    .permit(:name, :last_updated_by)
    .with_defaults(last_updated_by: current_user.name)
end

reverse_mergemerge 做同样的事情,唯一的区别是冲突的键会发生什么。 merge 使用通过参数传递的散列值,而 reverse_merge 更喜欢接收者的值。

params = { a: 1, b: 2 }
defaults = { a: 4, c: 5 }
params.merge(defaults)         #=> { a: 4, b: 2, c: 5 }
params.reverse_merge(defaults) #=> { a: 1, b: 2, c: 5 }
#       ^ aka with_defaults

由于method params.permit method用于过滤你想创建对象的参数,你可以使用上面给出的任何解决方案,但是如果你想修改def [=14=中的params ] 那么我想修改你的第二个解决方案

def customer_params
  params[:customer][:last_updated_by] = current_user.name 
  params.require(:customer).permit(:name, :last_updated_by)
end