Rails4, когда обновить один столбец, как получить это время обновления - PullRequest
0 голосов
/ 23 мая 2018

Я использовал Rails4.2.8, а база данных - Mysql.

В моих таблицах базы данных много columns: name, phone, email, address и так далее.

Когда пользователь изменит name и запишет время, когда произошло изменение, скажите ему: «Вы можете изменить свое имя через 30 дней».

Как я могу получить изменение пользователя во время?

Такой как эта картинка:

The example

В моей базе данных уже есть created_at и updated_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 голосов
/ 23 мая 2018

Используя миграцию, добавьте столбец в пользователях 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
0 голосов
/ 24 мая 2018

После добавления в поле с именем 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 для записи, проверка не пройдет.Затем сообщение может быть возвращено пользователю.

Это отличается от принятого ответа, делая его на уровне модели.Это где проверка должна содержаться.

0 голосов
/ 23 мая 2018

Вы можете добавить столбец «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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...