Ruby on rails RubyonRails设计了如何限制用户更改用户名的频率

Ruby on rails RubyonRails设计了如何限制用户更改用户名的频率,ruby-on-rails,devise,Ruby On Rails,Devise,`我最近开始开发rails应用程序,并使用Desive作为身份验证。但是我遇到了一堵墙。我想知道是否有一种方法可以设置用户更新用户名的周期限制。例如,如果用户今天更新其用户名,则在30天期限结束之前,他们应该无法再次更新用户名。 我查阅了Desive文档,但没有提及该功能,我也搜索了SO和web,但没有任何结果 任何帮助都将非常感激如何去做,或者至少被指向正确的方向。提前谢谢 我已经添加到用户模型中 after_save :name_last_updated def name_last_upd

`我最近开始开发rails应用程序,并使用Desive作为身份验证。但是我遇到了一堵墙。我想知道是否有一种方法可以设置用户更新用户名的周期限制。例如,如果用户今天更新其用户名,则在30天期限结束之前,他们应该无法再次更新用户名。 我查阅了Desive文档,但没有提及该功能,我也搜索了SO和web,但没有任何结果

任何帮助都将非常感激如何去做,或者至少被指向正确的方向。提前谢谢

我已经添加到用户模型中

after_save :name_last_updated

def name_last_updated
  if self.username_changed?
  self.name_last_updated_at = Time.now
end
但这不会更新上次更新时的colunm名称。任何关于我做错了什么的线索都会有帮助^^^谢谢

所以,在搞乱了一些代码之后,我想出了另一种方法。我创建了一个新的列来跟踪用户应该能够看到更新其用户名的表单的新时间

def username_next_update
 self.username_next_update_at = self.username_last_update_at + 2.minutes
end 
为了学习和测试,我增加了+2.5分钟 我在这之前做了一个保存。 在我看来,我把它包装在if和else语句中,尽管我对逻辑很困惑

 <% if current_user.username_next_update_at < time.zone.now %>
********
<% end %>

********

但我希望只有当它是>符号而不是时,它才能工作。您需要从头开始创建它

在用户表中创建一个新列,称之为
name\u last\u updated
,当用户第一次更新其姓名时,将该列设置为今天的日期。然后,每当用户想要更新其姓名时,检查该列并与今天的日期进行比较,查看是否已过30天:

if Date.today - user.name_last_update < 30
  #display error
end
如果Date.today-user.name\u last\u update<30
#显示错误
结束

我们可以使用Desive gem创建的“用户更新”列,并在用户模型中添加回调方法,以确保每次更新用户模型时都调用此方法

before_update { |user| user.write_attribute if user.is_permitted? }

def write_attribute
  self.user_name = params[:user][:user_name]
end

def is_permitted?
  if self.username_changed?
    Date.today - updated_at < 30
  end
end 
before|update{| user | user.write_属性,如果user.is_允许?}
def write_属性
self.user\u name=params[:user][:user\u name]
结束
允许使用def吗?
如果self.username\u发生更改?
Date.today-更新时间<30
结束
结束

您应该在更新之前使用
,并指定必须激活回调的记录,而不是在保存之后使用

我会这样做:

before_update :name_last_updated, if: :username_changed?

def name_last_updated
 if (self.name_last_updated_at.to_date + 30.days) < Date.today
  self.update(name_last_updated_at: Time.now)
 end
end
更新前:名称上次更新,如果::用户名更改? def名称\u上次\u更新 如果(self.name\u last\u updated\u在截止日期+30天)
我还想在用户模型中添加一个回调方法,以确保每次更新用户模型时都调用此方法。嘿,Ahmad,很抱歉回复太晚,before_save确实起到了作用。现在我遇到了一些问题,试图在application.controller中定义适当的方法,以限制用户在30天期限结束之前更新用户名。如果您能详细说明一下,我们将不胜感激。提前感谢!:)@LordLJ告诉我你的控制器在哪里更新用户,这样我可以更好地帮助你,你有一个定制的控制器或只是任何装置给你?哦,我只是使用任何装置provides@LordLJ然后,您必须覆盖注册控制器的
更新
操作。查看如何覆盖设备控制器。这是一项相当多的工作,但您将从这个过程中学到很多。您需要在\u safe
之前将此方法设置为
,以便它更改列然后保存它,而不是在\u save之后。