2014-11-29 2 views
0

레일 4 앱에서 Devise를 사용하고 있습니다.Devise 사용자에 대한 임의의 사용자 이름 만들기

사용자 기호 위로에 필요하지 않은 사용자 이름을 가지고 있지만, 나는 무작위로 하나를 할당 할.

나는 아래의 컨트롤러를 만들어 확인했습니다 : 사용자 이름이 강한 매개 변수입니다.

사용자 이름이 저장되지 않습니다. 왜 그 이유를 이해하도록 도와 주실 수 있습니까?

class UsersController < DeviseController 
    before_create :set_username 

    private 
    def set_username 
     o = [1..9].map { |i| i.to_a }.flatten 
     self.username = "user" + (0...10).map { o[rand(o.length)] }.join 
    end 
end 
+0

차이점을 이해하기 만하면 컨트롤러는 요청을 처리하기 때문에 수명주기가 없습니다. ActiveRecord :: Base (사용자, 회사, 자동차 등과 같은 모델)를 상속 한 객체는 생성, 저장, 소멸 등의 작업을 수행 할 수 있습니다. 이러한 작업은 before_create 등에서 호출 할 수 있습니다. – Austio

+0

해명 해 주셔서 감사합니다. 정말 기억에 남는 방법입니다. – user1573016

답변

1

컨트롤러 내부에서 자체를 사용 중입니다. 컨트롤러 내부에서 self는 컨트롤러 자체를 나타냅니다. 그래서 당신이 self.username을 말할 때, 그것은 컨트롤러가 아니라 모델의 변수 사용자 이름을 가리 킵니다.

또한 당신은 진정으로 고유 ID를 생성 SecureRandom를 사용해야합니다.

편집 : 코드를 사용자 모델로 이동하십시오.

편집 2 : after_create

가 코드를 변경해보십시오 사용이 도움이

class User 
    #use after create for setting the username 
    after_create :set_username 

    private 
    def set_username 
     self.username = "user-#{ SecureRandom.hex(10)}" 
    end 
end 

희망.

+0

위대한, 그 물건을 가리키는 주셔서 감사합니다! 불행히도 여전히 절약되지 않습니다. 내 경로에 문제가있을 수 있습니까? 내가 게시 '가입'=> 'devise/registrations # create' – user1573016

+0

내 잘못입니다. 코드는 결코 여기에 타격을주지 않습니다. 나는 컨트롤러에서 before_create 콜백을 사용하고 있다는 것을 알았습니다. 이것은 ActiveRecord 콜백이며 모델 내에서만 사용될 수 있습니다. 코드를 User.rb 모델로 옮기십시오. 이 변경 사항을 반영하도록 코드를 업데이트했습니다. – skmvasu

+0

감사합니다. 왜 모델에 있어야하는지 이해합니다. 그래도 사용자 이름을 저장하지는 않습니다. 왜 그런가? – user1573016

관련 문제