如何设置控制器参数的默认值?
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_merge
与 merge
做同样的事情,唯一的区别是冲突的键会发生什么。 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
我的数据库中有一个客户 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_merge
与 merge
做同样的事情,唯一的区别是冲突的键会发生什么。 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