2011-04-27 4 views
0

최종 해결책 :레일 3 모델의 성을 조합하여

나는 Devise를 사용하여 인증을 처리하는 Rails 3 앱이 있습니다. 가입 양식에서 나는 다음과 같은 필드가 있습니다

나는 이름과 성을 활용하고 '로그인'(예를 들어 성, 이름)이라는 데이터베이스 필드에 사용자 모델을 결합해야
<p><%= f.label :first_name %><br /> 
    <%= f.text_field :first_name %></p> 

    <p><%= f.label :last_name %><br /> 
    <%= f.text_field :last_name %></p> 

. 다음은 전체 사용자 모델입니다.

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    attr_accessible :first_name, :last_name, :email, :password, :password_confirmation, :remember_me, :login 

    validates :first_name, :last_name, :email, :password, :password_confirmation, :presence => true 

    before_create :create_login 

    def create_login 
    self.login = "#{last_name.capitalize}, #{first_name.capitalize}" 
    end 

end 

감사합니다.

+0

문자열을 연결하는 구문은 다음과 같아야합니다. self.login = "# {last_name}, # {first_name}" – a3uge

+0

작동하지 않습니까? –

+0

tks @ a3uge 및 @JeffPaquette. 내가 계속 얻고있는 오류는 "정의되지 않은 메소드'capitalize 'for nil입니다 : NilClass" – Jay

답변

1

나는 진심으로, 정직하게, 진정 루비의 힘의 사용에 박수를 보냅니다하지만,이 때문에 그런 것입니다 의 nil:NilClass 문제에 관해서는

def create_login 
    login = "#{last_name.capitalize}, #{first_name.capitalize}" 
end 

당신은 추가 : 두 문자열의 간단하고 정적 연결, 나는 함께 가고 싶어 first_name 및 last_name 열을 관련 이전의 사용자 테이블에 추가 하시겠습니까?

+0

. rake db : migration은 데이터베이스의 first_name 및 last_name 열을 생성했습니다. 유효성 검사 결과는 "이름은 공백 일 수 없습니다"및 "성은 공란 일 수 없습니다"로 표시됩니다. 흥미로운 점은 Devise 모델 외부에서 생성 된 필드가 유효성 검사를 통과하지 못하는 것입니다. – Jay

+0

thks @mharper. 여기에 유효성 검사 문제에만 전념하는 별도의 게시물을 추가했습니다. http://stackoverflow.com/questions/5806048/devise-additional-columns-to-user-model-not-validating – Jay

1
before_create :create_login 
validates :first_name, :presence => true 
validates :last_name, :presence => true 

def create_login 
    login = [last_name, first_name].map(&:capitalize).join(", ") 
end 

짧은 설명

내가 등록에 first_namelast_name를 얻기 위해 좋은 생각 : 그래서 우리는 그것에 광고 검증 것이다. 길이를 검증하고 일부 정규식과 일치시키는 것도 좋은 생각입니다.

그런 다음 로그인이 한 번만 생성되는 한 before_create 콜백을 추가합니다.이 콜백은 객체가 생성 될 때 (실행되지 않을 때) 실행됩니다. 유효성 검사가 통과 된 경우에만 콜백이 실행되므로 first_name 또는 last_name이 비어 있으면 유효성 검사가 통과되지 않고 first_namelast_name이 채워질 때까지 콜백이 실행되지 않습니다.

UPD

좋아, 지금까지의 당신이 당신의 오류로 :

def create_login 
    login = [last_name, first_name].compact.map(&:capitalize).join(", ") 
end 
+0

Thanks @ fl00r. last.name은 last_name이어야합니까? 다음과 같은 오류가 발생합니다 : 정의되지 않은 메서드'capitalize 'for nil : NilClass – Jay

+0

내 업데이트를 참조하십시오. – fl00r

+0

다시 @ fl00r. 여전히 정의되지 않은 메소드 'capitalize'에 대해 nil : NilClass – Jay