2008-10-25 39 views
6

Có thể viết Markdown nội dung có cú pháp không hợp lệ. Không hợp lệ nghĩa là thư viện BlueCloth không phân tích cú pháp nội dung và ném ngoại lệ. Trình trợ giúp markdown trong Rails không phát hiện bất kỳ ngoại lệ BlueCloth nào và do đó trang hoàn tất không hiển thị (trang Lỗi máy chủ 500 được hiển thị thay thế).Làm cách nào để xác thực tính năng Đánh dấu?

Trong trường hợp của tôi, người dùng được phép viết nội dung Markdown và lưu nó vào cơ sở dữ liệu. Nếu ai đó sử dụng cú pháp không hợp lệ, tất cả các nỗ lực hiển thị liên tiếp của nội dung đó đều không thành công (Mã trạng thái 500 - Lỗi máy chủ nội bộ).

Bạn giải quyết vấn đề này như thế nào? Có thể xác nhận cú pháp Markdown ở cấp Mô hình trước khi lưu vào cơ sở dữ liệu không?

+0

Bạn có thể muốn biết rằng BlueCloth có vấn đề khác nhau và rằng có những thư viện Markdown tốt hơn có sẵn bây giờ: http://tomayko.com/writings/ruby-markdown-libraries-real-cheap-for-you-two-for-price-of-one –

+0

Bạn có thể chia sẻ ví dụ về đánh dấu không hợp lệ của mình không? http://stackoverflow.com/questions/4751032/whats-an-example-of-some-invalid-markdown – Simon

+0

Là một sang một bên: xem thêm [Babelmark] (http://babelmark.bobtfish.net/) để so sánh với kết quả của các triển khai khác. – Arjan

Trả lời

9

Bạn nên viết phương pháp xác thực của riêng mình, trong đó bạn sẽ khởi tạo đối tượng BlueCloth và thử gọi phương thức to_html bắt bất kỳ ngoại lệ nào. Nếu bạn bắt một ngoại lệ, xác nhận không thành công, nếu không nó sẽ là ok.

Trong mô hình của bạn:

protected: 

def validate 
    bc = BlueCloth.new(your_markdown_string_attribute) 
    begin 
    bc.to_html 
    rescue 
    errors.add(:your_markdown_string_attribute, 'has invalid markdown syntax') 
    end 
end 
1

tôi đã thực hiện một chút nghiên cứu và quyết định sử dụng RDiscount thay vì BlueCloth. RDiscount có vẻ nhanh hơn và đáng tin cậy hơn BlueCloth.

Thật dễ dàng để tích hợp RDiscount trong môi trường Rails của bạn. Bao gồm snipped trong environment.rb của bạn và bạn đã sẵn sàng để đi:

begin 
    require "rdiscount" 
    BlueCloth = RDiscount 
rescue LoadError 
    # BlueCloth is still the our fallback, 
    # if RDiscount is not available 
    require 'bluecloth' 
end 

(thử nghiệm với Rails 2.2.0)

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