15

mając nadzieję, że ktoś tutaj wskaże mi właściwy kierunek.rails update_attributes zwraca wartość false podczas próby aktualizacji wartości db

Mam kontroler Aktualizacja def działająca "update_attributes". Obecnie zwraca wartość false, bez komunikatu o błędzie. Jestem całkiem nowy w Ruby, ale nie po to, żeby kodować, a to mnie zaskoczyło przez kilka dobrych dni! Próbuję pobrać model użytkownika i db zaktualizowane wartości określone poniżej.

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 

mój edit def ....

def edit 
    @user = current_user 
end 

Formularz wysyła następujące tej metody aktualizacji:

--- !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: example[email protected] 
commit: Update 
action: update 
controller: users 
id: '20' 

I params [: użytkownika] Zwraca:

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

Wszystkie te pola są w attr_accessible w Model, i mogę stworzyć użytkownika bez problemu.

oto wyjście development.log (przepraszam, że to trochę brudny) ....

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) 

Czy ktoś może pomóc wskazać gdzie jadę nie tak, proszę?

Z góry dziękuję!

+0

Czy sprawdziłeś 'development.log'? – Alex

+0

Opis komunikatu o błędzie byłby niezły - nie wiem, w jaki sposób uzyskujesz 'false' – Jonathan

+0

dodał dane wyjściowe development.log do głównego posta .... (po prostu wycofanie) – steve

Odpowiedz

39

Zarówno #update_attributes i #save najpierw sprawdzić, czy instancja model jest #valid? przed przejściem do zapisu w bazie danych. Jeśli twoja instancja modelu nie jest #valid?, te metody zwrócą fałsz. Aby zobaczyć, co jest nie tak z instancją modelu, spójrz na model swojego modelu: #errors.

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

Albo osadzone w swojej metodzie

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

To wszystko! Dokładnie tego potrzebowałem! Dziennik błędów wykazał, że brakuje mi pola, które należy zaktualizować wraz z tymi. Wielkie dzięki, teraz wiem, jak poprawnie debugować te błędy! :-) – steve

+1

Mam podobny problem teraz, próbowałem Rails.logger.info (@ user.errors.messages.inspect) i zwraca mi "True". Co to znaczy? Muszę zaktualizować kolumnę i dodałem kolumnę w attr_accessible. podczas aktualizacji zwraca mi wartość false, a zapytanie o wykonanie jest również dziwne. Zajrzyj tutaj http://paste.lisp.org/+2S4Y Nie mogę zaktualizować pól. jaki może być problem? –

+0

@JyotiRanjan zaznacz '@ user.errors.messages.inspect' działa przynajmniej w moim przypadku z Rails 4.2 – jmarceli

4

Można również uzyskać lepszą introspekcji podczas aktualizowania atrybutów poprzez wywołanie update_attributes! zamiast tego, co podnosi wyjątki zamiast po prostu powrocie fałszywe.

Powiązane problemy