web-dev-qa-db-ja.com

Rails 3:「textarea」からテキストを適切に表示する方法は?

私のRails 3アプリケーションでは、textareaを使用して、ユーザーがフォーラムで新しいメッセージを書けるようにしています。

ただし、メッセージが表示されると、すべての改行はスペースのように見えます(<br />はありません)。他の不一致の例があるかもしれませんが、私はまだ知りません。

これに対処する最も適切な方法は何でしょうか。

データベースに格納されているテキストは問題ないと思います(たとえば、<&lt;に変換されていることがわかります)。したがって、主な問題はプレゼンテーションです。

Railsこれには組み込みヘルパーメソッドがありますか?

simple_format は、私が必要としているものに似た動作をしますが、表示したくない<p>タグを追加します。)

37
Misha Moroshko

simple_formatは必要な処理を実行しないため、改行を<br>sに変換する簡単なヘルパーメソッドを作成します。

def nl2br(s)
  s.gsub(/\n/, '<br>')
end

次に、ビューで次のように使用できます。

<%= nl2br(h(@forum_post.message)) %>
28
Mischa

Railsにはすぐに使えるヘルパーメソッドがあるため、独自のメソッドを記述する必要はありません。

ドキュメントから:

simple_format(text, html_options={}, options={})

my_text = "Here is some basic text...\n...with a line break."

simple_format(my_text)
# => "<p>Here is some basic text...\n<br />...with a line break.</p>"

more_text = "We want to put a paragraph...\n\n...right there."

simple_format(more_text)
# => "<p>We want to put a paragraph...</p>\n\n<p>...right there.</p>"

simple_format("Look ma! A class!", :class => 'description')
# => "<p class='description'>Look ma! A class!</p>"
73
Michael Koper

テキストを囲むhtmlタグでstyle="white-space: pre-wrap;"を使用できます。これは、テキストの改行を尊重します。

34
efatsi

まだ誰かがここにリダイレクトされ、Rails 4:4: http://apidock.com/Rails/v4.0.2/ActionView/Helpers/TextHelper/simple_format を使用する場合

これで、ラップされるタグを指定できます(デフォルトはp)。

simple_format(my_text, {}, wrapper_tag: "div")
# => "<div>Here is some basic text...\n<br />...with a line break.</div>"
8
Ayonix

CSSのみのオプション

最も簡単なオプションの1つはcssを使用することだと思いますwhite-space: pre-line;

他の回答でも空白の使用について述べましたが、もう少し情報が必要だと思います。

ほとんどの場合、pre-lineではなくpre-wrapを選択する必要があります。違いを見る ここ

white-spaceについては、次のようなことはしないでください。

<p style="white-space: pre-line;">
  <%= your.text %>
</p>

出力に余分なスペースと改行が生成されます。代わりに、これで行ってください:

<p style="white-space: pre-line;"><%= your.text %></p>

HTML代替

別の方法は、テキストを<pre>タグで囲むことです。そして、私のCSSオプションに関する最後の注記は、ここでも当てはまります。

<p>
  <pre><%= your.text %></pre>
</p>

テキストを<pre>タグからスペースまたは改行で区切らないでください。

最終的な考え

この問題を少しグーグルで調べたところ、htmlアプローチはCSSのものよりクリーン度が低いと考えられているので、CSSを使用する必要があります。ただし、html-wayの方がブラウザ互換性が高いようです(古風なブラウザをサポートしていますが、誰でもかまいません)。

タグ前

空白

8
mizurnix

次のヘルパーは、改行を改行として保持し、HTMLまたはスクリプト(Javscriptなど)をプレーンテキストとしてレンダリングします。

def with_new_lines(string)
   (h(string).gsub(/\n/, '<br/>')).html_safe
end

ビューでそのまま使用

<%= with_new_lines @object.some_text %>
3
cevaris

white-space: pre-line。したがって、次の行(\ n)でレンダリングされます。

3
BartSabayton

TextareaのプレーンテキストをHTMLに変換する必要があります。

最も基本的なレベルでは、文字列の置換を実行できます。

 message_content.gsub! /\n/, '<br />'

Markdown (Rubyライブラリ: BlueCloth )または Textile (Rubyライブラリ: RedCloth などの特別な形式を使用することもできます。 )。

2
Jon Gauthier

私はRailsアプリでAceコードエディターを使用していて、コードを更新または作成するたびに、常に最初の行を除いてすべての行に余分なTABを追加するという問題がありました。私はできませんでした。 t gsubまたはjavascript replaceで解決します。しかし、そのテンプレートのレイアウトを無効にすると、誤って解決してしまいます。

だから、私はそれを解決しました

render :layout => false
0
mansim