2012-03-17 34 views
7

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?

Trả lời

4

Tôi nghĩ bạn đang đi đúng hướng với cuộc gọi lại before_validation.

Bạn có thể xác thực các thuộc tính ảo như mọi thuộc tính thông thường. Vì vậy, tất cả những gì bạn cần chỉ là một số xác nhận trong mô hình. Hãy thử điều này:

validates :departure_airport, presence: true 
validates :arrival_airport, presence: true 

này nên thêm một lỗi để các lỗi các đối tượng và các lỗi sẽ được hiển thị trong hình thức của bạn ...

+0

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

+0

Đó 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

+0

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