2010-06-01 22 views
8

Tôi có biểu mẫu đăng ký có các liên kết/thuộc tính lồng nhau bất cứ điều gì bạn muốn gọi cho chúng.Đường ray: Loại bỏ các lỗi xác thực "X không hợp lệ" chung

My Hierarchy là thế này:

class User < ActiveRecord::Base 
    acts_as_authentic 
    belongs_to :user_role, :polymorphic => true 
end 

class Customer < ActiveRecord::Base 
    has_one :user, :as => :user_role, :dependent => :destroy 
    accepts_nested_attributes_for :user, :allow_destroy => true 
    validates_associated :user 
end 

class Employee < ActiveRecord::Base 
    has_one :user, :as => :user_role, :dependent => :destroy 
    accepts_nested_attributes_for :user, :allow_destroy => true 
    validates_associated :user 
end 

Tôi có một số nội dung xác nhận trong các lớp này là tốt. Vấn đề của tôi là nếu tôi cố tạo và Khách hàng (hoặc nhân viên, v.v.) với một biểu mẫu trống, tôi sẽ nhận được tất cả các lỗi xác thực tôi sẽ nhận được cộng với một số lỗi chung như "Người dùng không hợp lệ" và "Khách hàng không hợp lệ". các lỗi tôi nhận được một cái gì đó như:

user.login can't be blank 
User is invalid 
customer.whatever is blah blah blah...etc 
customer.some_other_error etc etc 

Vì có ít nhất một trường không hợp lệ trong mô hình Người dùng lồng nhau, thêm thông báo "X không hợp lệ" được thêm vào danh sách lỗi. Điều này gây nhầm lẫn cho khách hàng của tôi và vì vậy tôi tự hỏi nếu có một cách nhanh chóng để làm điều này thay vì phải filer thông qua các lỗi bản thân mình.

Trả lời

6

Câu trả lời của Salil gần như đúng nhưng anh chưa bao giờ đạt được 100%. Dưới đây là cách chính xác để thực hiện:

def after_validation 
    # Skip errors that won't be useful to the end user 
    filtered_errors = self.errors.reject{ |err| %{ person }.include?(err.first) } 

    # recollect the field names and retitlize them 
    # this was I won't be getting 'user.person.first_name' and instead I'll get 
    # 'First name' 
    filtered_errors.collect{ |err| 
     if err[0] =~ /(.+\.)?(.+)$/ 
     err[0] = $2.titleize 
     end 
     err 
    } 

    # reset the errors collection and repopulate it with the filtered errors. 
    self.errors.clear 
    filtered_errors.each { |err| self.errors.add(*err) } 
    end 
+0

Ngoài ra, tôi đã đề xuất một yêu cầu tính năng như một giải pháp tốt hơn sau đó công việc này xung quanh: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/5632-validates_associated-should-be-allowed -to-not-create-an-error # ticket-5632-2 – DJTripleThreat

+0

Tôi nhận được lỗi "không chuyển đổi biểu tượng ẩn thành chuỗi" – Chemist

+0

@Chính sách này đang hoạt động cho phiên bản cũ hơn của đường ray. Hãy thử chỉnh sửa mã được cung cấp để mã hoạt động đúng với phiên bản bạn hiện đang sử dụng. – DJTripleThreat

3

Sử dụng after_validation phương pháp

def after_validation 
    # Skip errors that won't be useful to the end user 
    filtered_errors = self.errors.reject{ |err| %w{ user User }.include?(err.first) } 
    self.errors.clear 
    filtered_errors.each { |err| self.errors.add(*err) } 
    end 

EDITED

Lưu ý: -

Thêm vào danh sách sau đây trong trường hợp của bạn đó là tài khoản hoặc người dùng. bạn có thể thêm nhiều nếu bạn có nhiều assosciation cách nhau bởi không gian.

%w{ User user }.include?(err.first) #### This piece of code from the above method has logic which reject the errors which won't be useful to the end user 
+0

Ok điều này có vẻ đầy hứa hẹn! :) Tôi nghĩ rằng bạn có một lỗi ngữ pháp trong "Lưu ý: -" điều đó gây nhầm lẫn cho tôi .. "Thêm ... ???" Ngoài ra, tôi nên đặt chức năng này ở đâu? trong mỗi mô hình thực hiện điều này? Đây có phải là một chức năng ghi đè từ ARB? – DJTripleThreat

+0

xin lỗi về ngữ pháp :). đặt phương pháp này trong mọi mô hình mà bạn viết ** validates_associated ** – Salil

+0

Ok tôi sẽ upvote bạn bây giờ bởi vì điều này chủ yếu là làm việc. Một vấn đề mặc dù: thay vì điều này: ** Đăng nhập ** quá ngắn (tối thiểu 3 ký tự) ** Mật khẩu ** quá ngắn (tối thiểu 4 ký tự) ** Xác nhận mật khẩu ** quá ngắn (tối thiểu là 4 ký tự) Tôi nhận được thông tin này: ** User.login ** quá ngắn (tối thiểu 3 ký tự) ** User.password ** quá ngắn (tối thiểu 4 ký tự) ** Người dùng xác nhận mật khẩu ** quá ngắn (tối thiểu là 4 ký tự) Nếu bạn có thể tìm ra cách sửa lỗi này, tôi sẽ chấp nhận câu trả lời của bạn. – DJTripleThreat

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