2017-12-12 12 views
0

管理者アカウントでユーザーアカウントを作成すると、ユーザーの姓と名字によって自動的にユーザー名が生成されます。 ユーザー名が作成されたら、ユーザーは一度しか更新できないようにしたい - 注:これはいつでも、または複数のログイン後でも可能ですが、ユーザー名が一度変更されると変更される必要があります。ユーザーモデルの属性を一度だけ更新できるようにする

Railsとsimple_formを使用しています。編集フォームは以下の通りです。

= simple_form_for(current_user) do |f| 
    = f.error_notification 
    .form-inputs 
    = f.input :name, required: true, label: 'Name' 
    = f.input :username, required: true 
    = f.input :email, required: true 
    = f.input :password, required: true, placeholder: ("#{@minimum_password_length} characters minimum" if @minimum_password_length) 
    = f.input :password_confirmation, required: true 


    .form-actions 
    = f.button :submit, "Update Profile", class: 'btn btn-primary btn-block btn-lg' 

Admin/Usersコントローラ。

def create 
    @user = User.new(user_params) 
    @user.password = SecureRandom.base64() 
    nameArray = @user.name.split(' ') 
    @user.username = nameArray[0][0].downcase + nameArray[-1][0..6].downcase 
    respond_to do |format| 
     if @user.save 
     @user.send_reset_password_instructions 
     format.html do 
      redirect_to [:admin, @user], 
      notice: "#{@user} was successfully created. A confirmation email was sent to: #{@user.email}" 
     end 
     else 
     format.html do 
      flash[:alert] = "User #{@user} already exists, or you have not filled in all of the required fields." 
      render :new 
     end 
     end 
    end 
    end 

ありがとうございます。

答えて

1

のようなユーザーに新しい列を追加します。is_edited場合、ユーザーを更新するために制限を追加するには、ユーザーのコントローラで

class User < ApplicationRecord 
    after_update :set_edited! 
    before_update :check_if_edited! 

    def is_edited? 
    edited? 
    end 

    private 

    def check_if_edited! 
    # there you can set the error message or what you want 
    errors.add(:base, :invalid, message: "Your message")) if edited? 
    end 

    def set_edited! 
    transaction do 
     self.edited = true 
     self.save! 
    end 
    end 
end 

after_update calbackを追加するには、モデルのユーザーで

def change 
    add_column :users, :eited, :boolean, default: false 
end 

を編集しましたか?

def update 
    if current_user.is_edited? 
    // preform action 
    end 
end 

P.S.

class User < ApplicationRecord 
    after_create :assign_attributes 

    private 

    def assign_attributes 
    transaction do 
     self.password = SecureRandom.base64() 
     name_array = name.split(' ') 
     self.username = nameArray[0][0].downcase + nameArray[-1][0..6].downcase 
    self.save! 
    end 
    end 
end 
0

にユーザーをモデル化するために属性を割り当てるためのロジックを移行し、私によると、最良の方法は、ユーザモデルにcall_backを使用することです:

before_update{|user| 
    user.write_user_name_changed unless user.created_at == user.updated_at 
} 



def write_user_name_changed 
    self.user_name_changed = params[:username] 
    true 
    end 
+0

に '.updated_at'を更新することができ、他のものがある場合を除きユーザーレコード。 – Joe

関連する問題