2011-02-17 31 views
10

Tôi mô tả khá dài mà tôi muốn cắt ngắn bằng cách sử dụng truncate helper. Vì vậy, tôi đang sử dụng:Rails cắt ngắn helper với liên kết như bỏ qua văn bản

truncate article.description, :length => 200, :omission => ' ...' 

Vấn đề là tôi muốn sử dụng nhiều như một liên kết có thể click như vậy trong lý thuyết tôi có thể sử dụng này:

truncate article.description, :length => 200, :omission => "... #{link_to('[more]', articles_path(article)}" 

văn bản lậu được xử lý là không an toàn để nó đã trốn thoát. Tôi đã cố gắng để làm cho nó html_safe nhưng nó đã không làm việc, thay vì liên kết [more] trình duyệt của tôi vẫn hiển thị html cho liên kết đó.

Có cách nào để buộc cắt ngắn để in liên kết thiếu sót thay vì văn bản bỏ sót không?

+1

có thể trùng lặp của [Làm thiếu sót trong truncate ruby ​​một liên kết] (http: // stackoverflow.com/questions/4964073/make-omission-in-ruby-truncate-a-link) –

Trả lời

10

tôi sẽ đề nghị làm điều này một mình trong một phương pháp helper, như vậy bạn sẽ có một chút kiểm soát nhiều hơn sản lượng cũng như:

def article_description article 
    output = h truncate(article.description, length: 200, omission: '...') 
    output += link_to('[more]', article_path(article)) if article.description.size > 200 
    output.html_safe 
end 
+0

@ Pam-Thomakos Điều này làm việc tuyệt vời exept cho một vấn đề. Khi tôi bấm vào liên kết nó đi đến posts.1 thay vì bài/1. –

+0

Nó phải là số ít 'article_path' thay vì số nhiều' articles_path' – Patrick

+0

'h' trước truncate làm gì? – Patrick

7

giải pháp bẩn ... sử dụng phương pháp "thô "để unescape nó.
bạn phải chắc chắn về "sự tỉnh táo" về nội dung của mình.

raw(truncate article.description, :length => 200, :omission => "... #{link_to('[more]', articles_path(article)}") 

nguyên là người trợ giúp hành động như html_safe.
bye

chỉnh sửa: không phải là thiếu sót được thoát, mà là kết quả của phương pháp cắt bớt.

+1

Vấn đề là tôi không thể chắc chắn về tính đúng đắn của article.description –

4

Tôi đã gặp phải một tình huống tương tự và điều này đã thực hiện thủ thuật. Hãy thử (ngắt dòng cho dễ đọc):

(truncate h(article.description), 
        :length => 200, 
        :omission => "... #{link_to('[more]',articles_path(article)}") 
        .html_safe 

Bạn có thể sử dụng h để đảm bảo sự tỉnh táo của mô tả bài viết, và kể từ khi bạn đang thiết lập các link_to đến một đường dẫn mà bạn biết để không phải một cái gì đó có khả năng bất chính, bạn có thể đánh dấu các kết quả chuỗi dưới dạng html_safe mà không cần quan tâm.

+0

Bạn sẽ cần phải cẩn thận để vượt qua trong 'escape: false', ít nhất là của Rails 4.0.1, vì [' TextHelper # truncate' sẽ thêm lối thoát của riêng nó] (https://github.com/rails/rails/blob/58ab79ff9b34c22c3477e29763fdd4f4612e938d/actionpack/lib/action_view/helpers/text_helper.rb#L92) để ghép nối 'h (article.description)' và văn bản 'omission'. Không có số lượng '.html_safe' sẽ ngăn chặn nó. –

2

TextHelper#truncateblock form of truncate, cho phép bạn sử dụng một link_to không được trốn thoát, trong khi vẫn thoát văn bản cắt ngắn:

truncate("<script>alert('hello world')</script>") { link_to "Read More", "#" } 

#=> &lt;script&gt;alert(&#39;hello world&#39;...<a href="#">Read More</a> 
1

Là người duy nhất mà làm việc cho tôi:

<%= truncate(@article.content, length: 200, omission: " ... %s") % link_to('read more', article_path(@article)) %> 
10

Với Rails 4, bạn có thể/nên chuyển vào một khối cho liên kết:

truncate("Once upon a time in a world far far away", 
    length: 10, 
    separator: ' ', 
    omission: '... ') {  
    link_to "Read more", "#" 
} 
+0

Hoạt động. Thanks .. – Abram

+0

Đây là những gì đã làm cho tôi. Cảm ơn bạn! – iamse7en

1

Tôi đã có cùng một vấn đề, trong trường hợp của tôi, tôi chỉ sử dụng :escape => false. Đó làm việc:

truncate article.description, :length => 200, :omission => "... #{link_to('[more]', articles_path(article)}", :escape => false

Từ tài liệu:

Kết quả được đánh dấu dưới dạng HTML-an toàn, nhưng nó được thoát theo mặc định, trừ khi: thoát là sai .... liên kết: http://apidock.com/rails/ActionView/Helpers/TextHelper/truncate

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