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

时间:2018-12-23 13:14:43

标签: ruby-on-rails ruby strong-parameters

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

我在我的应用程序上安装了设备,因此它为我提供了current_user参数。我试图将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

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

4 个答案:

答案 0 :(得分:2)

由于您询问设置默认值的问题,因此我建议使用ActionController::Parameters#with_defaults方法,该方法只是ActionController::Parameters#reverse_merge的(更具表现力的)别名。

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

反向合并与普通合并具有相同的功能,唯一的区别是在冲突的键上会发生什么。普通合并使用提供的哈希值,而反向合并则首选原始哈希值而不是提供的哈希值。

答案 1 :(得分:0)

如果您需要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回调仅在执行create动作之前在last_updated_by参数上添加新键customer

注意,无需修改customer_params即可。


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

等待操作员选择正确的答案。

答案 2 :(得分:0)

如果仅在请求正文中没有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时,需要在每次创建和更新时都设置默认值,则应该在客户模型上执行此操作:

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

答案 3 :(得分:0)

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

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