2011-09-06 35 views
6

Tôi có một số đường ray tiêu chuẩn kiểm chứng thực trong mô hình của tôi:Rails không tạo xác nhận thất bại điệp

validates_presence_of :url_string 
validates_uniqueness_of :url_string 
validates_presence_of :stream_source 
validates_presence_of :width 
validates_presence_of :height 
validates_presence_of :name 
validates_uniqueness_of :name 
validates_presence_of :customer_name 
validates_presence_of :iframe_background_color 

Nếu tôi không điền vào một trong các lĩnh vực này trong hình thức của tôi sau đó tôi đưa trở lại dưới hình thức như mong đợi nhưng điều kỳ lạ là không có thông báo lỗi nào được hiển thị. Tôi đang sử dụng mã dưới đây để hiển thị các thông báo lỗi:

<% @camera.errors.full_messages.each do |error| %> 
    <p><%= error %></p> 
<% end % 

Tôi cũng đã cố gắng để in ra camera.errors @ đối tượng và đây là những gì được thể hiện:

#<ActiveModel::Errors:0x12db19bc @base=#<Camera id: 1, stream_source: "test", width: 640, height: 360, active: true, name: "test", url_string: "CAYD19Vp", customer_name: "test", iframe_background_color: "#FFFFFF", online: true, created_at: "2011-08-30 15:54:16", updated_at: "2011-09-06 15:52:48", audio: true, iframe_text_color: "#FF00FF", iframe_link_color: "#FF0000", notes: "Some notes!", offline_image_file_name: "Cake.jpg", offline_image_content_type: "image/jpeg", offline_image_file_size: 196591, offline_image_updated_at: "2011-09-06 12:12:38", pull_stream_url: "test", bitrate: "300-500", show_branding: false>, @messages={}> 

Như bạn có thể thấy băm thông điệp trống. Tôi đã thử đặt thông báo lỗi xác thực theo cách thủ công bằng cách thực hiện các thao tác sau:

nhưng cũng không điền vào băm thư.

điều khiển cập nhật hành động được hiển thị bên dưới:

def update 
    @camera = Camera.find(params[:id]) 
    if @camera.update_attributes(params[:camera]) 
    flash[:notice] = "Camera updated" 
    redirect_to nwcadmin_camera_path 
    else 
    redirect_to :action => :edit 
    end 
end 

Tôi đang sử dụng phiên bản của Ruby ruby ​​1.9.2p290 và Rails phiên bản 3.1.0.

Mọi hỗ trợ sẽ tuyệt vời!

Cảm ơn

+1

Mã điều khiển có thể hữu ích ở đây. – jdl

+0

Cảm ơn, tôi đã thêm hành động cập nhật bộ điều khiển. – stephenheron

+0

Tôi đã cố gắng tìm hiểu vấn đề của mình nhưng tôi không thể trả lời câu hỏi của mình trong 7 giờ nữa. Tôi sẽ đưa ra giải pháp ở đây trong thời gian này. Trong bộ điều khiển tôi đã sử dụng: redirect_to: action =>: chỉnh sửa tôi nên đã được sử dụng: render: action =>: chỉnh sửa Bằng cách sử dụng redirect_to tôi đã nhấn hành động chỉnh sửa trong bộ điều khiển mà là sau đó nhận một đối tượng máy ảnh mới từ cơ sở dữ liệu thay vì bảo toàn đối tượng máy ảnh khỏi hành động cập nhật. – stephenheron

Trả lời

5

Tôi đã cố gắng khắc phục vấn đề của mình. Trong bộ điều khiển tôi đã sử dụng:

redirect_to :action => :edit 

tôi nên đã được sử dụng:

render :action => :edit 

Bằng cách sử dụng redirect_to tôi đã nhấn hành động chỉnh sửa trong bộ điều khiển mà sau đó đã nhận được một đối tượng máy ảnh mới từ cơ sở dữ liệu thay vì bảo quản đối tượng máy ảnh hiện tại khỏi hành động cập nhật.

2

Trừ khi bạn gọi @camera.save hoặc @camera.valid?, các lỗi băm sẽ không được dân cư với các lỗi xác nhận. Vui lòng kiểm tra mã điều khiển của bạn.

+0

update_attributes không chạy xác thực vì nó chạy phương thức lưu sau khi nó đã cập nhật các thuộc tính của nó. Bạn có thể thấy điều này nếu bạn xem nguồn của update_attribute. http://apidock.com/rails/ActiveRecord/Base/update_attributes – stephenheron

2

Bạn có thể sử dụng flash [: message] hoặc flash [: notice] trong mã điều khiển để lưu thông báo lỗi, có thể được sử dụng để hiển thị lỗi. Link Có một cái nhìn trong liên kết, nó giải thích rõ ràng, làm thế nào để nối thêm các thông báo lỗi và sử dụng chúng để hiển thị. Biến thể hiện doestnot chứa bất kỳ lỗi nào khi không xác thực chạy trong bản cập nhật.

Bạn có thể sử dụng @camera_errors = @ camera.save để thu thập các lỗi và sau đó

<% @camera_errors.errors.full_messages.each do |error| %> 
    <p><%= error %></p> 
    <% end %> 
6

Chỉ cần cảnh báo rằng bạn sẽ nhận được lỗi Validation failed (ActiveRecord::RecordInvalid) với thông báo lỗi trống (nếu không có lỗi khác) khi bạn có khai báo before_validation và bất kỳ báo cáo nào trả về false.

Lưu ý rằng before_validation callbacks không phải trả lại false (nil là okay) và điều này có thể xảy ra một cách tình cờ, ví dụ, nếu bạn đang gán false đến một thuộc tính boolean trong dòng cuối cùng bên trong đó phương pháp gọi lại. Rõ ràng viết trả về true trong các phương thức gọi lại của bạn để thực hiện công việc này (hoặc chỉ đúng vào cuối nếu gọi lại của bạn là một khối (như đã ghi chú here)).

CẬP NHẬT: Điều này sẽ không còn là một vấn đề bắt đầu Rails 5.0, như return false sẽ không còn ngăn chặn chuỗi callback (throw :abort bây giờ sẽ ngăn chặn chuỗi callback).

CẬP NHẬT: Bạn cũng có thể nhận được ActiveRecord::RecordNotSaved: Failed to save the record nếu gọi lại trả về false.

+0

wow. tôi sẽ không bao giờ đoán được điều này. cảm ơn vì đã cứu tôi có thể là giờ kiểm tra! –

+1

@LawrenceWu, vâng, đã dành hàng giờ để tự tìm ra vấn đề. :-) –

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