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

Ruby on rails 如何设置控制器参数的默认值?,ruby-on-rails,ruby,strong-parameters,Ruby On Rails,Ruby,Strong Parameters,我的数据库中有一个customers表和一个名为“last_updated_by”的列。我想在此字段中以纯文本形式添加当前用户名 我在我的应用程序上安装了Desive,因此它给了我当前的用户参数。我试图将当前的user.name添加到客户允许的参数中,但没有成功 1- def customer_params params.require(:customer).permit(:name, :last_updated_by=>current_user.name) end 2- def cus

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

我在我的应用程序上安装了Desive,因此它给了我当前的用户参数。我试图将当前的user.name添加到客户允许的参数中,但没有成功

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

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

如果您需要上次更新的
参数进入customer参数(用于
ActionController::Parameters的customer散列键)
,则:

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

请注意,无需修改customer_参数以允许它


正如@JohanWentholt所展示的,带有默认值的
似乎是最好的方法。去做吧


等待OP选择正确答案。

如果只有当请求正文中不存在
参数[:last\u updated\u 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\u updated\u by
为nil),您应该在客户模型上执行此操作:

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

因为您要设置一个默认值,所以我建议使用method,它只是一个(更具表现力的)别名


反向合并与正常合并做相同的事情,唯一的区别是在冲突的键上发生了什么。正常合并使用提供的散列的值,而反向合并优先使用原始散列的值而不是提供的散列的值。

由于方法params.permit方法用于过滤要创建对象的参数,因此可以使用上面给出的任何解决方案,但是如果您想修改def customer_params中的参数,那么我想修改您的第二个解决方案

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

请记住,这不会设置默认值。如果参数中已存在值,则会覆盖该值。使用
| |=
赋值运算符。感谢您的回答,但我收到了错误“当前用户:符号的未定义方法'name'。好的,我将参数[:customer][:last\u updated\u by]=params.dig(:customer,:name)更改为参数[:customer][:last\u updated\u by]=current\u user.name,效果良好。但是我仍然很好奇为什么我不能直接在允许的参数中定义它。答案仍然没有这样设置默认值。如果您提供
?customer[last\u updated\u by]=Some+Name
参数,它将被set\u last\u updated\u by\u param方法覆盖。使用permit时未设置默认值的原因很简单,因为该方法不允许您设置默认值。@JohanWentholt允许参数的默认值可以通过设置。您应该详细解释为什么在控制器中需要默认值,因为使用rails将默认值设置为参数的最佳/简单方法是在modelI上,我在主要文章中对此进行了解释。我想自动添加最近更新的信息。
params[:last\u updated\u by]=params[:last\u updated\u by]。空白默认值“:params[:last_updated_by]
可以写成
params[:last_updated_by]| |=“Default value”
两个版本都没有问题,只是提供了一个替代方案。
def customer_params
  params
    .require(:customer)
    .permit(:name, :last_updated_by)
    .with_defaults(last_updated_by: current_user.name)
end
def customer_params
  params[:customer][:last_updated_by] = current_user.name 
  params.require(:customer).permit(:name, :last_updated_by)
end