2011-06-27 18 views
5

Tôi đã gặp phải nhiều vấn đề khác nhau với các trang web khác nhau trong nhiều năm qua với người dùng đặt dấu cách ở đầu/cuối của chuỗi và trường văn bản. Đôi khi những nguyên nhân gây ra vấn đề về định dạng/bố cục, đôi khi chúng gây ra sự cố tìm kiếm (ví dụ: tìm kiếm tìm kiếm sai mặc dù nó không thực sự), đôi khi chúng thực sự làm hỏng ứng dụng.ActiveRecord: làm cho tất cả các trường văn bản có dải gọi trên chúng trước khi lưu, trừ khi được chỉ định khác

Tôi nghĩ rằng nó sẽ hữu ích, thay vì đặt trong một loạt các callbacks before_save như tôi đã làm trong quá khứ, để thêm một số chức năng để ActiveRecord tự động gọi .strip trên bất kỳ chuỗi/trường văn bản trước khi lưu, trừ khi tôi nói với nó không, ví dụ với do_not_strip :field_x, :field_y hoặc một cái gì đó tương tự ở phía trên cùng của định nghĩa lớp.

Trước khi tôi đi và tìm ra cách để làm điều này, có ai nhìn thấy một giải pháp đẹp hơn? Chỉ cần rõ ràng, tôi đã biết rằng tôi có thể làm điều này:

before_save :strip_text_fields 

def strip_text_fields 
    self.field_x.strip! 
    self.field_y.strip! 
end 

nhưng tôi đang tìm kiếm một cách đẹp hơn.

cổ vũ, tối đa

Trả lời

1

Tôi đã viết một plugin cho mục đích này một thời gian trước đây. Tôi đã không thử nó trong một thời gian và nó không có xét nghiệm - vì vậy không có bảo đảm rằng nó vẫn hoạt động. Mặt khác sẽ là mô hình sạch sẽ:

class Story < ActiveRecord::Base 
    strip_strings :title, :abstract, :text 
end 
+0

Cảm ơn rất nhiều @Wukerplank, tôi đã kết hợp điều đó và dường như thực hiện công việc :) Tôi đoán nó tốt hơn từ quan điểm ít ngạc nhiên nhất để liệt kê rõ ràng các trường văn bản tôi muốn xóa trong các mô hình, chứ không phải hơn là liệt kê những cái tôi không muốn tách ra như tôi đã có ban đầu. Btw, liên kết cài đặt trên trang plugin của bạn không hoạt động: tôi nghĩ bạn chỉ cần thay "https" bằng "git" ngay từ đầu. Ngoài ra còn có một đặt còn lại trong đó, có lẽ là để gỡ lỗi? chúc mừng! max –

+0

Vâng, tôi cũng nghĩ rằng khai báo rõ ràng các trường sẽ tạo ra một mô hình dễ đọc hơn. Và cảm ơn cho các gợi ý, tôi sẽ làm sạch nó :) – Wukerplank

+0

nơi bạn đã thêm các vũ nữ thoát y chuỗi? Tôi đặt nó trong lib/modules và nó không tải –

10

Đây là mô-đun tiện dụng mà bạn có thể đưa vào lib và đưa vào mô hình của mình. Nó không có ngoại lệ mà bạn đã đề cập, nhưng nó tìm kiếm một phương pháp strip! có thể đủ tốt. Bạn có thể thêm tính năng ngoại lệ khá dễ dàng, nếu cần.

# lib/attribute_stripping.rb 
module AttributeStripping 

    def self.included(context) 
    context.send :before_validation, :strip_whitespace_from_attributes 
    end 

    def strip_whitespace_from_attributes 
    attributes.each_value { |v| v.strip! if v.respond_to? :strip! } 
    end 

end 

Sử dụng như thế này:

class MyModel < ActiveRecord::Base 
    include AttributeStripping 

    # ... 
end 

CẬP NHẬT (2013/09/10):

Xem xét lại câu trả lời này một vài năm sau đó, tôi thấy như thế nào gió đã thay đổi. Có một cách sạch hơn để làm điều đó ngay bây giờ. Tạo một module như thế này:

module AttributeStripper 

    def self.before_validation(model) 
    model.attributes.each_value { |v| v.strip! if v.respond_to? :strip! } 
    true 
    end 

end 

và thiết lập phương pháp của nó được gọi vào đúng thời điểm trong mô hình của bạn:

class MyModel < ActiveRecord::Base 
    before_validation AttributeStripper 

    # ... 
end 

Module này là dễ dàng hơn để kiểm tra vì nó không phải là một mixin.

+0

Để xây dựng điều này, hãy xem http://edgeguides.rubyonrails.org/active_record_validations.html#custom-validators – MCB

+0

Dường như không hoạt động với 'Cập nhật mẫu #'. Thuộc tính này bị tước bỏ nhưng không thực sự đưa nó vào cơ sở dữ liệu. Tôi không thể hiểu tại sao. Gọi 'Model # save' dường như hoạt động tốt. – Dex

2

Tôi đã xử lý các vấn đề về tính toàn vẹn dữ liệu này trong các ứng dụng khác nhau.

Tôi đã sử dụng để thao tác đầu vào như vậy.

Nhưng bây giờ, lời khuyên tốt nhất mà tôi đã thực sự nhìn thấy và theo sau là lưu trữ bất cứ điều gì người dùng gõ. Sau đó, xử lý hậu kỳ trên chương trình phụ trợ để thực hiện dải. Tạo các trường cơ sở dữ liệu bổ sung (được hủy) nếu bạn thực sự muốn nó trong bảng mô hình cơ sở dữ liệu.

Lý do chính cho điều này là một (chính) điều - khi người dùng muốn xem lại dữ liệu của họ, tức là chỉnh sửa, họ thường sẽ mong đợi để xem những gì họ gõ. Một lý do thứ hai là bạn sẽ tránh được khả năng rằng dải của bạn không hoạt động đúng và hoặc là mang dữ liệu hoặc thực sự ném một lỗi.

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