J'ai utilisé Rails4.2.8 et la base de données est Mysql.

Mes tables de base de données contiennent de nombreux columns: name, phone, email, address et ainsi de suite.

Lorsque l'utilisateur change name et enregistre l'heure du changement, dites à l'utilisateur "Vous pouvez changer votre nom après 30 jours".

Comment puis-je obtenir le changement d'utilisateur à l'heure?

Tels que cette image:

The example

Ma base de données contient déjà created_at et updated_at, mais j'ai trouvé que lorsque je mets à jour les informations utilisateur (pas seulement name), le updated_at changera, mais maintenant je veux quand le changement d'utilisateur name, je pourrais obtenir l'enregistrement de temps lorsque le changement s'est produit. Voici une partie de ma base de données:

some of database

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

J'avais essayé avec @DickieBOy et changer certains des codes, mais quand je mets à jour les informations utilisateur, j'obtiens l'erreur No route matches [POST]? Où ai-je eu le tort? Aidez-moi, s'il vous plaît .

Quelques codes de mon 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

Quelques codes de mon 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

Et quelques codes de mon _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 %>

J'ai trouvé ça avec def edit_day, quand je mets à jour l'utilisateur, ça va toujours se tromper the No route matches [POST] "/users/udaskffa"? Que devrais-je faire? Merci.

0
SylorHuang 23 mai 2018 à 18:56

3 réponses

Meilleure réponse

Après avoir ajouté un champ appelé name_updated_at. Avec une valeur par défaut de la date de création.

Rails a une fonction où vous pouvez vérifier si quelque chose a changé.

name_of_field_changed?

Dans ce cas:

name_changed?

Je recommanderais de vérifier cela lors de la validation.

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

Cela n'a pas été testé mais cela devrait fonctionner.

Lorsque vous appelez save sur l'enregistrement, la validation échoue. Le message peut ensuite être renvoyé à l'utilisateur.

Cela diffère de la réponse acceptée en le faisant au niveau du modèle. C'est là que la validation doit être contenue.

2
DickieBoy 24 mai 2018 à 09:03

Vous pouvez ajouter une colonne «updated_at» de type date-heure à votre table. Nous utilisons généralement des horodatages pour cela, ce qui crée une colonne pour created_at et updated_at dans la table. Supposons que vous souhaitiez ajouter des horodatages à une table d'utilisateurs existante: -

class AddTimestampsToUser < ActiveRecord::Migration
  def change
    add_timestamps(:users)
  end
end

De plus, si jamais vous créez une nouvelle table, ajoutez-y des horodatages.

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

Source: http://guides.rubyonrails.org/active_record_migrations.html#migration-overview

0
Abdul Haseeb 23 mai 2018 à 16:13

À l'aide de la migration, ajoutez une colonne dans les utilisateurs name_updated_at:datetime Au moment où l'utilisateur est créé avec le nom, définissez ce fichier avec l'heure actuelle-

def create
  @user =  User.create(user_params)
  if @user.name.present?
   @user.update(name_updated_at: Time.now)
  end
end

Et lors de l'action de mise à jour, faites quelque chose comme ~

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
2
Gabbar 23 mai 2018 à 18:02