我使用了Rails4.2.8
,数据库是Mysql
。
我的数据库表有很多columns
:
name
,phone
,email
,address
等等。
当用户更改name
并记录更改发生时间时,请告诉用户"您可以在30天后更改您的姓名"。
我怎样才能让用户更改发生的时间?
如下图:
我的数据库已经有created_at
和updated_at
,但我发现当我更新用户信息(不仅是name
)时,updated_at
会发生变化,但现在我想要在用户更改name
时,我可以在发生更改时获取时间记录。这是我的一些数据库:
++++++++++++ *********************************** ***** +++++++++++++++
我尝试使用@DickieBOy并更改了一些代码,但是当我更新用户信息时,我收到No route matches [POST]
错误?我哪里错了?请帮帮我。
我的user.rb
的一些代码:
validate :name_change
def name_change
if name_changed?
self.name_updated_at = Time.now
end
end
extend FriendlyId
friendly_id :name, :use => [:slugged, :finders]
def should_generate_new_friendly_id?
name_changed?
end
我的user_helper.rb
的一些代码:
def edit_day
edit_days = (@user.name_updated_at + 30.days).to_i
ctime = Time.now.to_i
st = (edit_days - ctime) / 1.day
if st > 0
return st
else
return 0
end
end
我的_form.html.erb
的一些代码:
<%= form_for @user do |f| %>
<div class="user_profile-infoEdit">
<%= f.label :name, "name", class: "userLabel " %>
<%= f.text_field :name, class: "userNameEdit" %>
<br>
<span class="text-gray fs12">30days can change one time
<span>Have
<span id="editDays"><%= edit_day %></span>
days can you change your name
</span>
</span>
</div>
<% end %>
我发现使用def edit_day
,当我更新用户时,它总是会出错the No route matches [POST] "/users/udaskffa"
?我该怎么办?感谢。
答案 0 :(得分:2)
使用迁移在用户name_updated_at:datetime
中添加一列
在使用名称创建用户时,请将此字段设置为当前时间 -
def create
@user = User.create(user_params)
if @user.name.present?
@user.update(name_updated_at: Time.now)
end
end
并在更新操作上执行〜
之类的操作def update
@user = User.find(Parma[:id])
if @user.name_updated_at <= Time.now - 30.days
#allow user to update name
@user.update(name: params[:name], name_updated_at: Time.now)
else
#send back user with error
flash[:error] = "you can change name after 30 days from last updated time"
end
end
答案 1 :(得分:2)
添加名为name_updated_at
的字段后。默认为创建日期。
Rails有一个功能,您可以检查是否有更改。
name_of_field_changed?
在这种情况下:
name_changed?
我建议在验证中检查一下。
validate :name_change_is_outside_of_day_limit, if: name_changed?
def name_change_is_outside_of_day_limit
if name_updated_at && name_updated_at < Date.today - 30.days
errors.add(:name, "can't be changed within 30 days of the last change.")
end
end
这是未经测试但它应该有用。
当你在记录上调用save
时,它将无法通过验证。然后可以将该消息返回给用户。
这与模型级别的接受答案不同。这是应该包含验证的地方。
答案 2 :(得分:0)
您可以添加一列&[39] updated_at&#39;日期时间类型到您的表格。我们通常使用时间戳来为表格中的created_at和updated_at创建一列。 假设您要将时间戳添加到现有用户表: -
class AddTimestampsToUser < ActiveRecord::Migration
def change
add_timestamps(:users)
end
end
此外,如果您创建新表,请为其添加时间戳。
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
t.timestamps
end
end
end
来源:http://guides.rubyonrails.org/active_record_migrations.html#migration-overview