Sau khi một số tìm kiếm, tôi không thể tìm thấy một lớp lót trong mô hình để giúp cho nó xảy ra. Hiện tại, Rails cung cấp Enums, nhưng không phải là một cách toàn diện để xác nhận hợp lệ các giá trị không hợp lệ.
Vì vậy, tôi đã chọn giải pháp tổng hợp: Để thêm xác thực trong bộ điều khiển, trước khi đặt strong_params
và sau đó bằng cách kiểm tra mô hình.
Vì vậy, trong mô hình, tôi sẽ tạo ra một thuộc tính và xác nhận tùy chỉnh:
tham dự.rb
enum :status => { your set of values }
attr_accessor :invalid_status
validate :valid_status
#...
private
def valid_status
if self.invalid_status == true
errors.add(:status, "is not valid")
end
end
Ngoài ra, tôi sẽ làm một kiểm tra đối với các thông số cho đầu vào không hợp lệ và gửi kết quả (nếu cần) để mô hình, vì vậy một lỗi sẽ được bổ sung vào đối tượng, do đó làm cho nó không hợp lệ
attends_controller.rb
private
def attend_params
#modify strong_params to include the additional check
if params[:attend][:status].in?(Attend.statuses.keys << nil) # to also allow nil input
# Leave this as it was before the check
params.require(:attend).permit(....)
else
params[:attend][:invalid_status] = true
# remove the 'status' attribute to avoid the exception and
# inject the attribute to the params to force invalid instance
params.require(:attend).permit(...., :invalid_status)
end
end
Nguồn
2017-10-02 11:10:43
mu và câu trả lời của mike là tốt - xem thêm http://stackoverflow.com/q/265725/887124, mang đến cho một số câu trả lời hơi khác nhau cho một câu hỏi tương tự. –
Vâng, tôi thực sự sử dụng một cái gì đó tương tự như giải pháp mà Bob đã cung cấp: [gist] (https://gist.github.com/1372650) – mnelson