2017-12-12 7 views
0

관리자 계정으로 사용자 계정을 만들면 사용자의 성 및 성으로 결정된 사용자 이름이 자동으로 생성됩니다. 사용자 이름이 만들어지면 사용자가 한 번만 업데이트 할 수있게하려고합니다. 참고 : 언제든지 여러 번 로그인 할 수 있지만 일단 사용자 이름이 변경되면 변경해야합니다.사용자 모델의 속성 업데이트를 한 번만 허용합니다.

레일 및 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. 사용자에게 모델 속성을 지정 논리를 마이그레이션

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