RoR修改记录时保存当前用户ID

问题描述 投票:0回答:2

我目前正在使用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,但不能为我的生活弄明白。

在此先感谢您的帮助。克里斯

ruby-on-rails
2个回答
1
投票

在您的更新方法中,您只需更改内存中的值,而不是实际将其持久保存到数据库中。 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中。但我发现使用一个块是优选的,因为它清楚地表明您正在使用参数中未提供的值。


0
投票

您可以将其移动到模型回调(保存之前),这将更新创建和更新的列,或者您可以将current_user与params本身合并

def weightset_params
params.require(something).permit(something).merge(modified_by: current_user)
end
© www.soinside.com 2019 - 2024. All rights reserved.