15

여기 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.rails update_attributes가 db 값을 업데이트하려고 시도하면 false를 반환합니다.

"update_attributes"를 실행하는 컨트롤러 업데이트가 있습니다. 현재 오류 메시지없이 false를 반환합니다. 나는 루비에 상당히 익숙하지만 코딩에 익숙하지 않다. 그리고 이것은 나를 좋은 며칠 동안 곤란하게 만들었다. 아래에 지정된 값으로 업데이트 된 User 모델과 db를 얻으려고합니다.

def update 
    #get currently logged in user 
    @user = current_user 
    #update user params based on edit form... 
    if @user.update_attributes(params[:user]) 
     redirect_to profile_path, :notice => "Successfully updated profile." 
    else 
     render :action => 'edit' 
    end 
end 

양식이 업데이트 방법에 다음을 전송

def edit 
    @user = current_user 
end 

내 편집 데프 .... :

--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess 
utf8: ✓ 
_method: put 
authenticity_token: 9T4ihVI0p8j7pZEFxof3Bfahi2a+o3BPmtXJDnfHT4o= 
user: !ruby/hash:ActiveSupport::HashWithIndifferentAccess 
    first_name: Amanda 
    last_name: Ross 
    is_owner: '1' 
    email: [email protected] 
commit: Update 
action: update 
controller: users 
id: '20' 

해, params [: 사용자가] 반환

{"first_name"=>"Amanda", "last_name"=>"Ross", "is_owner"=>"1", "email"=>"[email protected]"} 

이 필드는 모두에서 attr_accessible에 있습니다. 모델, 그리고 아무 문제없이 사용자를 만들 수 있습니다. 내가 잘못하시기 바랍니다거야 어디

여기

Started PUT "https://stackoverflow.com/users/20" for 127.0.0.1 at 2012-04-17 10:39:29 +0100 
Processing by UsersController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"9T4ihVI0p8j7pZEFxof3Bfahi2a+o3BPmtXJDnfHT4o=", "user"=> {"first_name"=>"Amanda", "last_name"=>"Ross", "is_owner"=>"1", "email"=>"[email protected]"},  "commit"=>"Update", "id"=>"20"} 
    [1m[36mUser Load (1.0ms)[0m [1mSELECT "users".* FROM "users" WHERE "users"."id" = 20 LIMIT 1[0m 
>>>>>>>>>>>> 
{"first_name"=>"Amanda", "last_name"=>"Ross", "is_owner"=>"1", "email"=>"[email protected]"} 
    [1m[35m (0.0ms)[0m begin transaction 
    [1m[36mUser Exists (0.0ms)[0m [1mSELECT 1 FROM "users" WHERE (LOWER("users"."email") =  LOWER('[email protected]') AND "users"."id" != 20) LIMIT 1[0m 
    [1m[35mUser Exists (0.0ms)[0m SELECT 1 FROM "users" WHERE ("users"."email" = '[email protected]'  AND "users"."id" != 20) LIMIT 1 
    [1m[36m (0.0ms)[0m [1mrollback transaction[0m 
Rendered users/_form.html.erb (7.0ms) 
Rendered users/edit.html.erb within layouts/application (10.0ms) 
Rendered layouts/_includes.html.erb (30.0ms) 

누구 가능성이 지적 도움이 될 .... development.log 파일 출력 (죄송이 조금 지저분한의)입니까?

미리 감사드립니다.

+0

'development.log'를 확인 했습니까? – Alex

+0

오류 메시지에 대한 설명이 좋을 것입니다. 어떻게'false'인지 알 수 없습니다. – Jonathan

+0

메인 포스트에 development.log 출력이 추가되었습니다 .... (단지 롤백을 얻음) – steve

답변

39

#update_attributes#save은 모두 데이터베이스에 쓰기 작업을 계속하기 전에 모델 인스턴스가 #valid?인지 먼저 확인합니다. 모델 인스턴스가 #valid?이 아닌 경우이 메서드는 false를 반환합니다. 모델 인스턴스의 문제점을 확인하려면 모델 #errors을 살펴보십시오. 예외를 제기하는 대신 update_attributes!를 호출하는 대신 단지 false를 반환하여 속성을 업데이트 할 때 당신의 방법에 포함

Rails.logger.info(@user.errors.messages.inspect) 

또는,

def update 
    @user = current_user 
    if @user.update_attributes(params[:user]) 
    redirect_to profile_path, :notice => "Successfully updated profile." 
    else 
    # print the errors to the development log 
    Rails.logger.info(@user.errors.messages.inspect) 
    render :action => 'edit' 
    end 
end 
+0

그게 전부입니다! 그게 바로 내가 필요로하는 것입니다! 오류 로그에 나는 이것들과 함께 업데이트해야 할 필드가 없다는 것이 밝혀졌습니다. 대단히 고마워, 지금 나는이 오류들을 적절하게 디버깅하는 법을 알고있다. :-) – steve

+1

지금 비슷한 문제에 직면하고 있습니다. Rails.logger.info (@ user.errors.messages.inspect) 을 시도하고 "True"를 반환합니다. 무슨 뜻이에요? 열을 업데이트해야하며 attr_accessible에 열을 추가했습니다. 그것을 업데이 트하는 동안 날 false를 반환하고 그것도 실행 이상한 쿼리입니다. 여기를 보시길. http://paste.lisp.org/+2S4Y 필드를 업데이트 할 수 없습니다. 무엇이 문제일까요? –

+0

@JyotiRanjan은'@ user.errors.messages.inspect'를 확인합니다. 적어도 제 경우에는 Rails 4.2에서 작동합니다 – jmarceli

4

당신은 또한 더 나은 성찰을 얻을 수 있습니다.

관련 문제