我的数据库上有一个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
如何在控制器中设置一些默认值。
答案 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