2013-04-25 4 views
4

이 방법이 작동하는지 확인했습니다. 기본적으로 컨트롤러에서 전자 메일을 가져 와서 특정 사용자의 전자 메일을 변경합니다.모델/ActiveRecord가 새 데이터를 저장하지 않음

그러나 실제로 데이터를 저장하지 않습니다. 잘못된 전자 메일 형식을 전달하고 올바른 전자 메일 메서드를 전달하면 false를 반환하고 true를 반환하면 새 전자 메일이 할당되고 안전함이 호출됩니다.

# Allows user to change email address 
def change_email(newmail) 
    address = EmailVeracity::Address.new(newmail) 

    if address.valid? 
    self.email = newmail 
    self.save 
    return true 
    else 
    return false 
    end 

end 

나는 어떤 힌트 먼저 로그를 확인하지만 아무것도 내가 가진 전부는 없다 :
Started POST "/members/editmail" for 127.0.0.1 at 2013-04-25 17:33:44 +0200 
Processing by MembersController#editmail as HTML 
    Parameters: {"authenticity_token"=>"*****=", "mail"=>"*****@gmail.com"} 
    ←[1m←[35mUser Load (1.0ms)←[0m SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 
    ←[1m←[36mCharacter Load (0.0ms)←[0m ←[1mSELECT `characters`.* FROM `characters` WHERE `characters`.`user_id` = 1←[0m 
    ←[1m←[35m (0.0ms)←[0m BEGIN 
    ←[1m←[36mUser Exists (0.0ms)←[0m ←[1mSELECT 1 FROM `users` WHERE (`users`.`email` = BINARY '*****@gmail.com' AND `users`.`id` != 1) LIMIT 1←[0m 
    ←[1m←[35mUser Exists (0.0ms)←[0m SELECT 1 FROM `users` WHERE (`users`.`username` = BINARY '******' AND `users`.`id` != 1) LIMIT 1 
    ←[1m←[36m (0.0ms)←[0m ←[1mROLLBACK←[0m 
Redirected to http://localhost:3000/members/1 
Completed 302 Found in 10ms (ActiveRecord: 1.0ms) 

은 또한이 속성을 변경하는 방법이 훨씬 의미가 없습니다. 인증을 위해 Devise gem을 사용하기 때문에 current_user 변수를 사용하여 현재 로그인 한 사용자의 User 객체를 검색 한 다음 컨트롤러에 current_user.email = newmail; current_user.save을 호출하면됩니다.

답변

1

self.save! 저장하지 않으면 예외가 발생합니다.

또한,이 맞지 않을 수 있습니다

self.save 
return true 

self.save는 성공적으로 저장 아닌지에 따라 true 또는 false를 반환합니다. 그래서 당신은 return true 제거 할 및 반환 값이 하나가

self 키워드가이 상황에서 필요하지 않습니다 self.save에서 반환, 어느 쪽도 return 키워드하자 수 있습니다. 그래서이 코드에 해당 : 해당합니다

# Allows user to change email address 
def change_email(newmail) 
    address = EmailVeracity::Address.new(newmail) 

    if address.valid? 
    self.email = newmail 
    save 
    true 
    else 
    false 
    end 
end 

또한 당신이 원하는 안 어느

# Allows user to change email address 
def change_email(newmail) 
    address = EmailVeracity::Address.new(newmail) 

    if address.valid? 
    self.email = newmail 
    save 
    end 
    address.valid? 
end 

에.

+0

감사합니다. self.save! 도와 줬어. 내 Devise User 모델에 추가 검증에 오류가있는 것 같습니다. –

0

사용자 모델의 전자 메일 필드에 사용자 지정 유효성 검사를 추가하고 사용자 매개 변수를 전송하도록 양식을 설정하고 (새 전자 메일을 사용하려면 여기 레일 문서 란 http://guides.rubyonrails.org/form_helpers.html#binding-a-form-to-an-object) 같은 코드를 실행하는 것이 더 좋을 것 같습니다

if @user.update_attributes(params[:user], :as => :admin) 
    redirect_to @user, :notice => "User updated." 
else 
    render :action => 'edit', :alert => "Unable to update user." 
end 

귀하가 조치를 제출했습니다.

관련 문제