11

私はbest_in_placegemを使用して、Railsアプリでインライン編集を行っています。

オブジェクトのプロパティの1つはタイプtextであり、テキスト領域で編集したいので、次のようにしました。

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

動作しますが、編集されていない場合、すべての戻り値(\ n)が削除されます。

:display_with => :simple_formatbest_in_placeに渡されるオプションに追加して、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)適用しても、同じ問題が発生します。

4

6 に答える 6

7

私は同じ問題を抱えていましたが、 best_in_place ドキュメントで説明されているように「ajax:success」イベントにバインドし 、新しい行を に変換することで解決しました<br />

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

単純な改行の代わりに、テキスタイルやマークダウンなどの軽量マークアップ言語を使用することもできます。これらの Javascript コンバーターは、こちら (テキスタイル)こちら (マークダウン)にあります。

best_in_place の display_with オプションで textilize メソッドを使用できたので、Textile を使用しました。

更新された JavaScript:

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

また、best_in_place テキストエリアでのみこの動作が必要な場合は、data-type 属性を確認できます。

$('.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.
于 2012-05-25T06:32:39.370 に答える
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

期待どおりに動作します。ほとんど。
唯一残っている問題: テキストを編集するときに、テキストエリアからフォーカスを外した後、新しい行が再び失われます。ページを更新すると、再び正しく表示されます。

于 2012-03-09T11:17:15.233 に答える
1

\nを に置き換えて、ユーザーがさらに変更を加えよう<br>とすると、ユーザーにはすべてのテキストが 1 行だけに表示され、読みにくく、編集しにくくなります。

上記の回答に基づいて、このソリューションを作成しました。これにより\r、成功するとすべてが削除されます。

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

これにより、余分な行が表示されなくなります。このソリューションの利点は、ユーザーがフィールドを再度編集することを選択した場合、すべてが以前と同じように表示されることです。

于 2012-11-06T20:17:46.527 に答える