Ruby on Rails设计,如何限制用户更改用户名的频率

时间:2017-10-03 23:22:27

标签: ruby-on-rails devise

`我最近开始使用rails应用程序并使用devise作为身份验证。但是我碰到了一堵墙。我想知道是否有办法设置用户更新用户名的时间限制。例如,如果用户今天更新了他们的用户名,他们应该无法再次更新它,直到30天的时间段过去。 我查看了设计文档,但没有解决该功能,我也搜索SO和网络但无济于事。

如果能够解决这个问题,或者至少要指出正确的方向,我们将非常感激。提前谢谢!

我已添加到用户模型

after_save :name_last_updated

def name_last_updated
  if self.username_changed?
  self.name_last_updated_at = Time.now
end

但是这不会更新colunm name_last_updated_at。我所做错的任何线索都会有所帮助^^谢谢!

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

def username_next_update
 self.username_next_update_at = self.username_last_update_at + 2.minutes
end 

为了学习和测试目的,我增加了+ 2.minutes 我做了一个before_save。  在我看来,我把它包裹在if和else语句中,尽管我对逻辑很困惑。

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

但我希望它只有在&gt;标志而不是&lt;。任何提示都会有所帮助或任何更好的选择:)

3 个答案:

答案 0 :(得分:1)

您需要从头开始创建它。

在用户表格中创建一个新列,将其称为name_last_updated,当用户首次更新其名称时,将该列设置为今天的日期。然后,每当用户想要更新他们的名字时,请检查该列并与今天的日期进行比较,看看是否已经过了30天:

if Date.today - user.name_last_update < 30
  #display error
end

答案 1 :(得分:1)

我们可以使用由devise gem创建的user updated_at列,并在用户模型中添加一个回调方法,以确保每次更新用户模型时都调用此方法。

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 

答案 2 :(得分:0)

您应该使用before_update并指定哪条记录必须激活回调,而不是使用after_save

我会做这样的事情:

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