Rails4在更新一列时如何获得此更新时间

时间:2018-05-23 15:56:22

标签: ruby-on-rails time

我使用了Rails4.2.8,数据库是Mysql

我的数据库表有很多columns:  namephoneemailaddress等等。

当用户更改name并记录更改发生时间时,请告诉用户"您可以在30天后更改您的姓名"。

我怎样才能让用户更改发生的时间?

如下图:

The example

我的数据库已经有created_atupdated_at,但我发现当我更新用户信息(不仅是name)时,updated_at会发生变化,但现在我想要在用户更改name时,我可以在发生更改时获取时间记录。这是我的一些数据库:

some of database

++++++++++++ *********************************** ***** +++++++++++++++

我尝试使用@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"?我该怎么办?感谢。

3 个答案:

答案 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