Tôi đang chạy Ruby (1.9.3) trên Rails (3.2.0) và gặp vấn đề với việc xác nhận các thuộc tính ảo.Xác nhận các thuộc tính ảo trong Ruby on Rails
Tôi có mô hình Flight
đại diện cho một chuyến bay, trong đó có một thuộc tính đại diện cho sân bay khởi hành và khi đến.
Bởi vì select
để chọn một sân bay có tiềm năng rất lớn, tôi đã chọn tham gia giải pháp tự động hoàn thành, hoạt động hoàn toàn tốt. Tôi đang sử dụng một callback before_validation
đúng cư ID thực tế của sân bay:
before_validation do
self.departure_airport = Airport.find_by_long_name(departure_airport_name)
self.arrival_airport = Airport.find_by_long_name(arrival_airport_name)
end
Vấn đề là, tuy nhiên, khi người dùng nhập vào tên của một sân bay mà không tồn tại trong cơ sở dữ liệu, cam kết không vì ID của một trong hai sân bay là nil
. Tuyệt quá. Có gì không lớn, tuy nhiên, đó là thất bại xác nhận này không được phản ánh trên các hình thức bởi vì về mặt kỹ thuật, đó là đầu vào cho lĩnh vực khác:
validates :departure_airport, :arrival_airport presence: true
attr_accessor :departure_airport_name, :arrival_airport_name
<%= f.input :departure_airport_name %>
<%= f.input :arrival_airport_name %>
Đây có phải là ngay cả những cách để đúng cách đi về, chuyển tên của sân bay vào một ID trong cuộc gọi lại before_validation
? Và nếu có, làm thế nào tôi có thể nhận được các lỗi xác nhận để hiển thị trên thuộc tính tên ảo của sân bay?
Cảm ơn đã phản ứng nhanh chóng! Tôi đã có xác nhận hợp lệ trên 'exit_airport' và' arrival_airport'. Vấn đề là đây không phải là các trường mà 'đầu vào' trên biểu mẫu đại diện. Tôi không thể đơn giản xác nhận sự hiện diện bởi vì khi ai đó nhập văn bản vào chúng, trường này hiện diện, nhưng đối tượng 'Airport' thực sự sẽ bị thiếu. – Laurens
Đó là lý do tại sao bạn đăng ký gọi lại 'before_validation'. Khi người dùng nhập sai ngữ pháp, nó sẽ không tìm thấy sân bay và việc xác nhận sẽ không thành công. Lỗi sẽ được thêm và hiển thị cho người dùng. Có lẽ bạn nên xem xét thêm một massage lỗi tùy chỉnh. – klump
Xin lỗi vì lỗi của tôi. Tôi không hiểu. Có thể bạn cần phương pháp xác thực của riêng bạn. Bạn có thể thêm lỗi vào đối tượng với 'self.errors.add (: fieldname," message ")'. Nếu bây giờ bạn sử dụng 'departure_airport_name' làm tên trường và thêm một thông báo, nó sẽ được hiển thị trong trường' departure_airport_name'. – klump