15

hy vọng ai đó ở đây có thể chỉ cho tôi đúng hướng.đường ray update_attributes trả về false khi cố cập nhật giá trị db

Tôi có bộ điều khiển Cập nhật def chạy "update_attributes". Hiện tại nó trả về false, không có thông báo lỗi. Tôi khá mới với Ruby, nhưng không phải để viết mã, và điều này đã khiến tôi bối rối trong một vài ngày! Tôi đang cố gắng để có được mô hình User và db được cập nhật với các giá trị được chỉ định bên dưới.

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 

tôi chỉnh sửa def ....

def edit 
    @user = current_user 
end 

Hình thức gửi sau để phương pháp cập nhật này:

--- !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' 

Và params [: hướng dẫn] trả về:

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

Tất cả các trường này đều có thể truy cập được Mô hình và tôi có thể tạo người dùng mà không gặp bất kỳ sự cố nào.

đây là đầu ra development.log (xin lỗi đó là một chút lộn xộn) ....

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) 

thể bất cứ ai có thể giúp chỉ ra nơi tôi sẽ sai, xin vui lòng?

Cảm ơn trước!

+0

Bạn đã kiểm tra 'development.log' chưa? – Alex

+0

Một mô tả về thông báo lỗi sẽ tốt đẹp - không biết làm thế nào bạn chỉ nhận được 'false' – Jonathan

+0

thêm output.log đầu ra trong bài chính .... (chỉ nhận được một rollback) – steve

Trả lời

39

Cả hai #update_attributes#save trước tiên sẽ kiểm tra xem phiên bản mẫu của bạn là #valid? trước khi tiếp tục ghi vào cơ sở dữ liệu. Nếu phiên bản mẫu của bạn không phải là #valid? thì các phương thức này sẽ trả về false. Để xem có gì sai với trường hợp mô hình của bạn, hãy xem mô hình của bạn #errors.

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

Hoặc nhúng trong phương pháp của bạn,

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

Đó là nó! Đó chính xác là những gì tôi cần! Nhật ký lỗi cho thấy tôi thiếu một trường cần được cập nhật cùng với các trường này. Cảm ơn rất nhiều, bây giờ tôi biết làm thế nào để gỡ lỗi đúng các lỗi này quá! :-) – steve

+1

Tôi đang đối mặt với vấn đề tương tự bây giờ, tôi đã thử Rails.logger.info (@ user.errors.messages.inspect) và nó trả về cho tôi "True". Nó có nghĩa là gì? Tôi phải cập nhật một cột và tôi đã thêm cột vào attr_accessible. trong khi cập nhật nó trả về cho tôi false và truy vấn nó đang thực thi cũng lạ. Hãy xem tại đây http://paste.lisp.org/+2S4Y Tôi không thể cập nhật các trường. những gì có thể là vấn đề? –

+0

@JyotiRanjan kiểm tra '@ user.errors.messages.inspect' nó hoạt động ít nhất trong trường hợp của tôi với Rails 4.2 – jmarceli

4

Bạn cũng có thể mẫn hơn khi cập nhật các thuộc tính bằng cách gọi update_attributes! thay vào đó, điều này làm tăng ngoại lệ thay vì chỉ trả về false.

Các vấn đề liên quan