2012-03-08 14 views
11

Rails uygulamasında satır içi düzenleme yapmak için best_in_place taş kullanıyorum. Benim nesnenin özelliğininRails gem ile satır içi düzenleme 'best_in_place' - hata: textarea'da düzenleme yapıldıktan sonra yeni satırlar kayboluyor

Bir tip text ait olduğunu ve bir metin alanında düzenlenecek istiyorum, bu yüzden bu yaptı:

<%= best_in_place @myobject, :description, :type => :textarea %> 

düzenlenirken değil zaman çalışır, ancak tüm döner (\ n) kaldırıldı.

Ben best_in_place geçirilen seçeneklere :display_with => :simple_format ekleyerek, simple_format kullanarak çalıştı: beklendiği gibi

düzenlenirken değil
<%= best_in_place @myobject, :description, :type => :textarea, :display_with => :simple_format %> 

, yeni hatlar görüntülenir. Ancak baskıya girme tıklaması bozuldu ve yukarıda yeni bir tire eklendi. Bir textarea kutusu tıklatıldığında tıklatılıyor, ancak boş ve oraya girilen metin nesneme geri kaydedilmiyor.

Mülkte kayıtlı içerik yalnızca düz metindir, herhangi bir html içermiyor. yama uygulanırken https://github.com/bernat/best_in_place/pull/111
Ancak (el, dosyaya .../gems/best_in_place-1.0.6/spec/spec_helper.rb kadar), hala aynı sorun var:


Bu sorun (ve yama) benim sorunla ilgili görünüyordu.

cevap

7

Aynı sorunu yaşadım ve best_in_place documentation'da açıklandığı gibi "ajax: success" olayına bağlayarak ve yeni satırları <br /> 'a dönüştürerek çözdüm.

$('.best_in_place').bind('ajax:success', function(){ this.innerHTML = this.innerHTML.replace(/\n/g, '<br />') }); 

Ayrıca, basit satır sonları yerine, tekstil gibi hafif bir işaretleme dili veya işaretleme kullanmayı da seçebilirsiniz. Bunlar için Javascript dönüştürücüleri here (textile) ve here (markdown) bulunabilir.

Tekstil ile gittim çünkü best_in_place'ın display_with seçeneğindeki textilize yöntemini kullanabiliyordum.yalnızca veri tipi özellik için kontrol edebilirsiniz best_in_place textareas bu davranışı istiyorsanız Ayrıca

$('.best_in_place').bind('ajax:success', function(){ $(this).JQtextile('textile', this.innerHTML) }); 

,:

güncellenmiş javascript

$('.best_in_place').bind('ajax:success', function(){ 
    if ($(this).attr('data-type') == 'textarea') 
     $(this).JQtextile('textile', this.innerHTML) 
}); 

Son olarak, üzerinde dönüşüm maç sunucu tarafı:

:display_with => lambda { |v| textilize(v).html_safe } // the RedCloth gem may be required. 
+0

: display_with => lambda {| v | v.nil? ? '': textilize (v) .html_safe} ' –

4

Yarım çalışma çözümü bulundu. show.html.erb yılında

:

<%= best_in_place @myobject, :description, :type => :textarea, :display_as => 'description_format' %> 

ve myobject.rb yılında:

def description_format 
    self.description.gsub(/\n/, "<br>") 
end 

Bu beklenen işleri olarak. Neredeyse.
Kalan tek sorun: metni düzenlediğinizde, textarea'dan odaklanmamış olduktan sonra, yeni satırlar yeniden kaybolur. Sayfayı yenilerseniz, tekrar doğru şekilde görüntülenir.

1

\n iseile değiştirilirve kullanıcı daha fazla değişiklik yapmayı seçiyor, kullanıcı tüm metni sadece bir satırda görecek ve okumayı ve düzenlemeyi zorlaştıracak.

Yukarıdaki yanıtlara dayanarak, bu \r ürününü başarı ile kaldırır.

$('.best_in_place').bind('ajax:success', function(){ 
    if ($(this).attr('data-type') == 'textarea') { 
     this.innerHTML = this.innerHTML.replace(/\r/g, '') 
    } 
}); 

Bu, fazladan satırların görüntülenmemesini sağlar. Bu çözümün avantajı, kullanıcı alanı yeniden düzenlemeyi seçerse, her şey öncekine göre gösterilir.

0

Buradaki cevapların hepsinin işe yaradığını düşünüyorum. Bu sadece başka bir alternatif. Best_in_place alanını <pre> etiketi arasına ekleyebilir ve satırları eklemeyle ilgilenirsiniz. Tabii ki bazı biçimlendirme ve stil değişiklikleri gerekli olacak, ancak problemi kolayca çözüyor. Bir güncelleştirme sonrasında hat biçimlendirmesi kaybolmasıyla ilgili aşağıdaki soruya yanıt olarak

0

. Bazı deneylerden sonra, bunu işe aldım. Bu, bir textarea olarak kullanılan ve Veritabanında tip metin olarak saklanan "comment" adlı bir alan örneğidir. formda

:

div class: "single-spacing", id: "comment_div" do 
    best_in_place coursedate, :comment, as: :textarea, url: [:admin,coursedate], ok_button: "Uppdatera", cancel_button: "Cancel", class: "editable", 
    :display_with => lambda { |c| simple_format(c.gsub("<br />", ""), {}, sanitize: false) } 
end 

css olarak:

.single-spacing { 
    ul br { 
    display: none; 
} 
    ol br { 
    display: none; 
} 
    div br { 
    display: none; 
    } 
h3 { 
    border-bottom: 1px dotted #e8e8e8; 
    padding-bottom: 15px; 
} 
blockquote { 
    border-color: #a7c2d9; 
    p { 
     font-size: 14px; 
     color: #777777; 
     line-height: 1.5; 
    } 
    } 
} 

CoffeeScript:

# refresh textarea bip on coursedate when edited to reload line breaks after update 
    $('#comment_div').bind 'ajax:success', -> 
    $('#comment_div').load(document.URL + ' #comment_div'); 
    return 
0

Bu benim için hile yaptı.

$('.best_in_place').bind 'ajax:success', -> 
    content = $(this).text().replace(/\n/g, "<br>") 
    $(this).html(content) 

veya JQuery

$('.best_in_place').bind('ajax:success', function(){ 
    content = $(this).text().replace(/\n/g, "<br>") 
    $(this).html(content) 
}); 
(v) içeriği 'bu yüzden bunun için test nil zaman .html_safe bir hata atma olduğu bulunmuştur
İlgili konular