web-dev-qa-db-ja.com

Rails-テキストエリアに改行を追加する

モデルにテキストのいくつかの段落を入力できるRailsアプリがありました。問題は、改行の入力方法がわからないことです。

"{ln} {/ ln}; {&nbsp} and {br} {/ br}"を追加しようとしましたが、htmlがテキストとして表示され、ブレークはありません。

とにかく、テキスト領域コントロールがモデルエントリ内に配置したhtmlのいずれかを使用するように設定できますか?

入力できるものはありますかRailsは認識します。ここに行を入れてください。

62
ChrisWesAllen

問題は、後でレンダリングするので、値を編集することではありません。テキストエリアで編集中に値に改行文字を追加するには、単にリターンキーを押します。後でその値を再編集しても、空白はまだ残っているはずです。

空白のレンダリングは注意が必要な部分です。 HTMLでは、空白は一般に重要ではありません。ブラウザが使用するようなレンダラーは、空白の連続文字列に対して単一のスペースを表示します。そのため、単に値をページにダンプするだけでは十分ではありません。

<%= obj.description %>

値が"One \t \n \n Two"であっても、画面には"One Two"として表示されます。

これらの改行文字を表示するときに実際に行を分離するには、レンダリングする前にそれらをHTMLに変換する必要があります。

<%= obj.description.gsub(/\n/, '<br/>') %>

もちろん、ユーザーがHTMLに含まれるデータを入力している場合、値をエスケープして [〜#〜] xss [〜#〜] から保護する必要があります。サポートする必要があるのが新しい行だけである場合は、次のように簡単にする必要があります。

<%= h(obj.description).gsub(/\n/, '<br/>') %>

より複雑な書式設定を許可する場合は、 Markdown および Textile (両方ともRailsがヘルパービューメソッドを提供します)を調べます。 XSS防止のために提供するサポートがある場合は、必ず調査してください。

84
Ian Lesperance

テキストエリアの改行は「\ n」として生成されます。ただし、問題は、単にビューにダンプしただけでは、HTMLソースの改行に過ぎないことです。

Rails _simple_format_ヘルパーを使用して、これの一部を処理してみてください: http://api.rubyonrails.org/classes/ActionView/Helpers /TextHelper.html#M002285

改行をHTMLタグに自動変換します。 <%= simple_format(my_text_field) %>のようなもので使用できます。

106
Karl

ユーザー入力を変更せずに、これをcssに追加します。

white-space: pre-line;

ユーザー入力に\ rまたは\ n(入力)を新しい行として表示します。

20
bershika

残りのテキストをエスケープしながら、文字列で改行を表示する別の方法を次に示します。

<%= safe_join(@object.textarea_input.split("\r\n"), "<br />".html_safe) %>
8
vpsz

こちらをご覧ください http://code.byteblues.com/2012/03/23/preloading-a-text-input-area-text_area-with-data-that-c​​ontains-a-line-break/ =

<%=raw text_area_tag :keywords, keywords, :rows => 8 %>
1
moo

Railsのどのバージョンを使用していますか??これを処理する方法は、Rails 2と3で異なります。

レコードの値が"foo<br />bar"だとしましょう

Rails 3で、HTMLを評価したい場合は<%=raw "foo<br />bar" %>を実行できます。そうすると、ビューが表示されたときに改行が表示されます。

Rails 2では、それをする必要はありません、ただ<%= "foo<br />bar" %>

また、HTMLはとにかくtextareaで評価されません。

1
kentor

simple_formatの問題は、<b><i><hr><h1>...などの他のタグも追加していることです。
他のタグなしで改行する場合は、パーシャルを作成することをお勧めします(line_breakと呼びます):

<% text.split("\n").each do |t| %>
  <%= t %><br>
<% end %>

次に、ビューからそれを呼び出すだけです:

<%= render partial: 'line_break', locals: {text: some_text} %>
1
Sagiv Ofek

他の答えは間違っています。テキスト領域はレンダリングされません
TEXTAREA要素のinnerHTML値はHTMLをレンダリングしないため、改行として。

改行HTMLエンティティを追加する必要があります:&#10;

例:

<textarea><%= "LINE 1&#10;LINE 2&#10;LINE 3".html_safe %></textarea>

テキスト領域の改行-スタックオーバーフロー も参照してください。

0
Yarin

\nメモリが機能する場合(今日はあまりうまくいっていません...自己責任で試してみてくださいlol)

編集:textareaについて話していると仮定して、単純な出力であれば、<br>

0
mynameiscoffey

上記の答えは良かった:

  • gsub(@Ian)はうまく機能しました
  • simple_format(@Karl)は@Aaronが指摘したように、すべてを<p>

そこで、次のように微調整しました。

simple_format(value, {}, wrapper_tag: 'div')
0
Jon Kern