2012-03-08 15 views
11

पर संपादन के बाद खो दिया है मैं best_in_place मणि उपयोग कर रहा हूँ एक रेल app में कुछ इनलाइन संपादन करने के लिए कर रहे हैं।इनलाइन संपादन - बग: नई लाइनों पाठ क्षेत्र

मेरी वस्तु की संपत्ति का एक प्रकार text की है, और मैं इसे एक पाठ क्षेत्र में संपादित किया जा करना चाहते हैं, तो मैं ऐसा किया:

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

यह काम करता है, लेकिन जब संपादित नहीं किया जा रहा है, सब रिटर्न (\ n) हटा दिए जाते हैं।

मैं simple_format का उपयोग कर, विकल्प best_in_place के लिए पारित करने के लिए :display_with => :simple_format जोड़कर की कोशिश की:

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

जब संपादित नहीं किया जा रहा है, नई लाइनों की उम्मीद के रूप में प्रदर्शित कर रहे हैं। लेकिन संस्करण दर्ज करने के लिए क्लिक टूटा हुआ है, और ऊपर एक नया डैश जोड़ा गया है। इसे क्लिक करने से टेक्स्टटेरा बॉक्स प्रदर्शित होता है, लेकिन यह खाली है, और वहां दर्ज टेक्स्ट मेरी ऑब्जेक्ट पर वापस सहेजा नहीं जाता है।

सामग्री मेरी संपत्ति में बचाया सिर्फ सादा पाठ है, यह किसी भी html शामिल नहीं है। https://github.com/bernat/best_in_place/pull/111
हालांकि, जब पैच लागू (मैन्युअल रूप से, फ़ाइल .../gems/best_in_place-1.0.6/spec/spec_helper.rb करने के लिए), मैं अभी भी एक ही समस्या है:


यह समस्या (और पैच) मेरी समस्या से संबंधित लग रहा था।

उत्तर

7

मुझे एक ही समस्या थी और best_in_place documentation में वर्णित "AJAX: सफलता" ईवेंट को बाध्यकारी करके हल किया गया और नई लाइनों को <br /> पर परिवर्तित कर दिया गया।

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

आप साधारण लाइन ब्रेक के बजाय कपड़ा या मार्कडाउन जैसी हल्के मार्कअप भाषा का उपयोग करना भी चुन सकते हैं। इनके लिए जावास्क्रिप्ट कन्वर्टर्स here (textile) और here (markdown) पाया जा सकता है।

मैं वस्त्र के साथ चला गया के बाद से मैं सिर्फ best_in_place के display_with विकल्प में textilize विधि का उपयोग कर सकते हैं।

अद्यतन जावास्क्रिप्ट:

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

इसके अलावा, अगर आप केवल best_in_place textareas पर इस व्यवहार आप डेटा प्रकार विशेषता के लिए जाँच कर सकते हैं चाहते हैं:

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

अन्त में, पर रूपांतरण से मेल खाते हैं सर्वर पक्ष:

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

मैंने पाया कि .html_safe एक त्रुटि फेंक रहा था जब (v) सामग्री तो मैं इसके लिए परीक्षण नहीं के बराबर था ': display_with => लैम्ब्डा {| v | v.nil? ? '': textilize (v) .html_safe} ' –

4

एक आधे कामकाजी समाधान मिला।

show.html.erb में:

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

और myobject.rb में:

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

यह उम्मीद काम करता है के रूप में। लगभग।
एकमात्र शेष समस्या: जब आप पाठ को संपादित करते हैं, तो टेक्स्टटेरा से फ़ोकस करने के बाद, नई लाइनें फिर से खो जाती हैं। यदि आप पृष्ठ को रीफ्रेश करते हैं, तो यह सही तरीके से प्रदर्शित होता है।

1

यदि \nके साथ बदल दिया गया हैऔर उपयोगकर्ता अधिक संशोधन करने का विकल्प चुनते हैं, उपयोगकर्ता केवल एक पंक्ति पर सभी टेक्स्ट देखेंगे, जिससे इसे पढ़ने और संपादित करना कठिन हो जाता है।

उपर्युक्त उत्तरों के आधार पर मैंने इस समाधान को बनाया, जो सफलता पर किसी भी \r को हटा देता है।

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

यह सुनिश्चित करता है कि कोई अतिरिक्त लाइन प्रदर्शित नहीं होती है। इस समाधान का लाभ यह है कि यदि उपयोगकर्ता फिर से फ़ील्ड को संपादित करना चुनता है, तो सब कुछ पहले जैसा दिखाया गया है।

0

मुझे लगता है कि यहां सभी उत्तरों का जवाब है। यह अभी तक एक और विकल्प है। आप <pre> टैग के बीच में best_in_place फ़ील्ड जोड़ सकते हैं और यह लाइनों को जोड़ने का ख्याल रखेगा। बेशक कुछ स्वरूपण और शैली में परिवर्तन की आवश्यकता होगी, लेकिन यह आसानी से समस्या को हल करता है।

0

अद्यतन के बाद खोए गए लाइन स्वरूपण के बारे में नीचे दिए गए प्रश्न के जवाब में। कुछ प्रयोग के बाद, मुझे यह काम करने के लिए मिला। यह "टिप्पणी" नामक फ़ील्ड का एक उदाहरण है जिसे टेक्स्टरेरा के रूप में उपयोग किया जाता है और डेटाबेस में टाइप टेक्स्ट के रूप में संग्रहीत किया जाता है।

रूप में:

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 

सीएसएस में:

.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

यह मेरे लिए चाल किया था।

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

या jQuery

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