8

Chúng tôi đang sử dụng cho các thành viên của chúng tôi. Chúng tôi đã thêm trường tos_agreement (boolean) vào lược đồ thành viên của chúng tôi và chúng tôi đã thêm nó vào views/devise/registrations/new.html.haml.Thêm hộp kiểm thỏa thuận TOS với Devise

Trong mô hình thành viên, chúng tôi có một quy tắc xác nhận như sau:

validates_acceptance_of :tos_agreement, :allow_nil => false, 
    :accept => true 

Nó hoạt động tốt - nếu bạn không chấp nhận TOS, bạn không thể đăng ký.

Tuy nhiên, sự cố đi kèm với việc chỉnh sửa cài đặt của bạn. Nếu bạn truy cập /members/edit, bạn sẽ nhận được biểu mẫu nơi bạn có thể thay đổi địa chỉ email hoặc mật khẩu của mình. Không có trường nào cho thỏa thuận TOS vì điều này không thể thay đổi tại thời điểm này. Tuy nhiên, khi bạn thực hiện thay đổi (ví dụ: thay đổi mật khẩu của bạn) và gửi biểu mẫu, nó sẽ trả về một thông báo lỗi rằng thỏa thuận TOS không thể sai.

Làm cách nào để chúng tôi có thể nói rằng không bao giờ cố gắng sửa đổi thỏa thuận TOS sau lần đăng ký đầu tiên?

Chỉnh sửa: vì vậy tôi nghĩ rằng vấn đề cơ bản là chúng tôi đã có: tos_agreement trong attr_accessible của chúng tôi, đó là một ý tưởng rất tồi tệ bây giờ tôi nghĩ về nó. Nhưng nếu chúng ta loại bỏ nó, làm thế nào để chúng ta sửa đổi Devise để chấp nhận tham số và làm một cái gì đó với nó mặc dù nó không được gán cho hàng loạt?

+0

Bạn cũng không thực sự cần để tạo ra một lĩnh vực trong cơ sở dữ liệu cho các loại biến, đường ray sẽ tạo ra một trường ảo cho bạn. http://guides.rubyonrails.org/active_record_validations.html#acceptance –

Trả lời

15

Bạn có thể vượt qua một: trên =>: tạo tùy chọn để validator để nó chỉ kiểm tra trên đăng ký:

validates_acceptance_of :tos_agreement, :allow_nil => false, :accept => true, :on => :create 
+1

Điều này phải được đánh dấu là câu trả lời đúng. Nó chỉ đơn giản là trả lời câu hỏi của poster ban đầu. và chính xác những gì OP ban đầu được yêu cầu. nếu hoàn cảnh thay đổi sau đó cho OP, điều đó không có nghĩa là ghi có người trả lời câu hỏi chính xác của bạn. – alybadawy