2012-10-02 27 views
7

Tôi có biểu mẫu với 3 trường ActiveRecord. Một trong những trường đó có kiểu ngốc nghếch và yêu cầu xác thực STATE-DEPENDENT. (Ví dụ, tôi chỉ xác thực trường nếu đối tượng đang được tạo trên biểu mẫu trình hướng dẫn thiết lập.)cách bộ điều khiển có thể đặt lỗi xác thực theo cách thủ công cho một trường nhất định

Trong trình xử lý POST của tôi để tạo đối tượng, tôi nghĩ tôi có thể gọi lỗi.thêm để chèn điều kiện lỗi đặc biệt

@foo = Foo.new(params[:foo]) 
if goofy_conditions(params[:foo][:goofy_field]) 
    @foo.errors.add(:goofy_field, "doesn't meet the goofy conditions") 
end 
respond_to do |format| 
    if @foo.save 
    ... 
    else 
    ... redirect back to form (with error fields hilited) 

Tuy nhiên, làm @ foo.errors.add() trong bộ điều khiển dường như không làm bất cứ điều gì ... nó không ngăn lưu() nếu các trường khác vượt qua xác thực.

Cách khác là đặt trình xử lý xác thực tùy chỉnh vào mô hình ... Tôi biết sử dụng errors.add (: field, 'msg') hoạt động tốt ... nhưng trong trường hợp đó, trình điều khiển của tôi có thể 'vượt qua' như thế nào thông tin cho trình xác thực cho biết liệu trường có cần được xác thực hay không.

+1

đặt một attrbute nonpersisted trên mô hình, nói hướng dẫn, thiết lập thích hợp và sau đó chỉ sử dụng nó trong xác nhận nrmal? –

Trả lời

12

Đó là logic mô hình. Hãy xem custom validations

class GoofyThing < ActiveRecord::Base 
    validate :goofy_attribute_is_goofy 

    def goofy_attribute_is_goofy 
    if goofy_conditions(self.goofy_field) 
     self.errors.add(:goofy_field, "doesn't meet the goofy conditions") 
    end 
    end 
end 

Sau đó, nó sẽ hoạt động giống như mọi xác thực khác.

Sửa

Bạn có điều kiện có thể xác nhận với :if tùy chọn:

attr_accessible :via_wizard 
validate :goofy_attribute_is_goofy, :if => lambda { self.via_wizard } 

và trong điều khiển của bạn:

class WizardController < ApplicationController 
    before_filter :get_object, :set_wizard 

    #... 

    def get_object 
    @object = GoofyThing.find(params[:id]) 
    end 

    def set_wizard 
    @object.via_wizard = true 
    end 
end 
+0

ah! attr_accessible: via_wizard là những gì tôi đã bỏ lỡ. Cảm ơn nhiều! – jpwynn

Các vấn đề liên quan