我目前正在使用Devise Gem来控制用户身份验证,我想在我的表的modified_by字段中记录当前用户ID。通过执行此操作,我在创建记录时成功记录了用户
# POST /weightsets
def create
@weightset = Weightset.new(weightset_params)
@weightset.modified_by = current_user
if @weightset.save
redirect_to @weightset, notice: 'Weightset was successfully created.'
else
render :new
end
end
但是,当我尝试相同的更新时,它不会在modified_by字段中保存用户ID
def update
if @weightset.update(weightset_params)
@weightset.modified_by = current_user
redirect_to @weightset, notice: 'Weightset was successfully updated.'
else
render :edit
end
end
我猜我需要以某种方式通过params中的current_user,但不能为我的生活弄明白。
在此先感谢您的帮助。克里斯
在您的更新方法中,您只需更改内存中的值,而不是实际将其持久保存到数据库中。 create方法之间的区别在于,在创建时,您在分配值后调用.save
。
相反,您可以传递一个块来更新,这将在持久化更改之前产生记录:
def update
updated = @weightset.update(weightset_params) do |ws|
ws.modified_by = current_user
end
if updated
redirect_to @weightset, notice: 'Weightset was successfully updated.'
else
render :edit
end
end
您可以在create方法中执行相同操作来清理它:
# POST /weightsets
def create
@weightset = Weightset.new(weightset_params) do |ws|
ws.modified_by = current_user
end
if @weightset.save
redirect_to @weightset, notice: 'Weightset was successfully created.'
else
render :new
end
end
或者你可以按照@Aarthi的建议将modified_by
合并到params中。但我发现使用一个块是优选的,因为它清楚地表明您正在使用参数中未提供的值。
您可以将其移动到模型回调(保存之前),这将更新创建和更新的列,或者您可以将current_user与params本身合并
def weightset_params
params.require(something).permit(something).merge(modified_by: current_user)
end