2012-01-16 30 views
23

Tôi đang sử dụng Rails v2.3bỏ qua phương pháp xác nhận nhất định trong mẫu

Nếu tôi có một mô hình :

class car < ActiveRecord::Base 

    validate :method_1, :method_2, :method_3 

    ... 
    # custom validation methods 
    def method_1 
    ... 
    end 

    def method_2 
    ... 
    end 

    def method_3 
    ... 
    end 
end 

Như bạn thấy ở trên, tôi có phương pháp xác nhận 3 tùy chỉnh và tôi sử dụng chúng để xác thực mô hình.

Nếu tôi có một phương pháp khác trong lớp mô hình này mà tiết kiệm một thể hiện mới của mô hình như sau:

# "flag" here is NOT a DB based attribute 
def save_special_car flag 
    new_car=Car.new(...) 

    new_car.save #how to skip validation method_2 if flag==true 
end 

Tôi muốn bỏ qua xác nhận của method_2 trong phương pháp đặc biệt này để lưu xe mới, làm thế nào để bỏ qua các phương pháp xác nhận nhất định?

+0

'Xe ​​đặc biệt' của bạn có thuộc tính nào có thể phân biệt với xe hơi không đặc biệt không? Điều đó sẽ làm cho điều này đơn giản. – Dogbert

+1

Bạn đã qua các tài liệu [xác nhận có điều kiện] (http://guides.rubyonrails.org/active_record_validations_callbacks.html#conditional-validation) chưa? –

+0

Xin chào, tôi đã cập nhật bài đăng của mình cho phương pháp lưu một chiếc xe đặc biệt. Về cơ bản, tôi có một thông số "flag" truyền vào phương thức, và nếu "flag" là true, tôi muốn bỏ qua xác nhận của method_2 –

Trả lời

46

Cập nhật mô hình của bạn để này

class Car < ActiveRecord::Base 

    # depending on how you deal with mass-assignment 
    # protection in newer Rails versions, 
    # you might want to uncomment this line 
    # 
    # attr_accessible :skip_method_2 

    attr_accessor :skip_method_2 

    validate :method_1, :method_3 
    validate :method_2, unless: :skip_method_2 

    private # encapsulation is cool, so we are cool 

    # custom validation methods 
    def method_1 
     # ... 
    end 

    def method_2 
     # ... 
    end 

    def method_3 
     # ... 
    end 
end 

Sau đó, trong điều khiển của bạn đặt:

def save_special_car 
    new_car=Car.new(skip_method_2: true) 
    new_car.save 
end 

Nếu bạn nhận được :flag qua biến params trong điều khiển của bạn, bạn có thể sử dụng

def save_special_car 
    new_car=Car.new(skip_method_2: params[:flag].present?) 
    new_car.save 
end 
+0

'attr_writer' sẽ là' attr_accessor' hoặc bạn sẽ nhận được một ' undefined local variable hoặc method 'skip_method'' error. Hoặc bạn có thể viết chức năng đọc của riêng bạn như 'skip_method? '. – Ashitaka

+0

@Ashitaka được cập nhật, cảm ơn! – shime

+0

Cảm ơn câu trả lời này .. Tôi đã tìm kiếm rất nhiều về điều này.Đối với bất cứ ai khác có thể gặp phải vấn đề này, tôi nghĩ bạn sẽ gặp lỗi MassAssignment nếu bạn làm như vậy. Bạn có thể tránh lỗi bằng cách làm như vậy: 'new_car = Car.new',' new_car.skip_method_2 = params [: flag] .present? ' – lnreddy

11

Việc sử dụng cơ bản xác nhận điều kiện là:

class Car < ActiveRecord::Base 

    validate :method_1 
    validate :method_2, :if => :perform_validation? 
    validate :method_3, :unless => :skip_validation? 

    def perform_validation? 
    # check some condition 
    end 

    def skip_validation? 
    # check some condition 
    end 

    # ... actual validation methods omitted 
end 

Kiểm tra các tài liệu cho biết thêm chi tiết.

Điều chỉnh nó để screnario của bạn:

class Car < ActiveRecord::Base 

    validate :method_1, :method_3 
    validate :method_2, :unless => :flag? 

    attr_accessor :flag 

    def flag? 
    @flag 
    end  

    # ... actual validation methods omitted 
end 

car = Car.new(...) 
car.flag = true 
car.save 
+0

Trên thực tế, cờ không phải là một thuộc tính dựa trên DB ... Vì vậy, ... bất kỳ cách nào khác? –

+0

Xem câu trả lời được cập nhật sử dụng tính năng attibute không dựa trên db. –

-1

Tùy thuộc vào thời tiết cờ đúng với sai, sử dụng phương pháp save(false) để bỏ qua xác nhận.

+3

'save (false)' sẽ bỏ qua toàn bộ quá trình xác nhận, không chỉ một phương thức. – shime

+0

Ngoài ra, nó là 'save (validate: false)', không phải 'save (false)' – Fritzz

+0

đó là 'save (false)' trong Rails v2.3 – daslicious

0

Sử dụng khối trong xác thực của bạn như sau:

validates_presence_of :your_field, :if => lambda{|e| e.your_flag ...your condition} 
Các vấn đề liên quan