私のRails 3アプリケーションでは、textarea
を使用して、ユーザーがフォーラムで新しいメッセージを書けるようにしています。
ただし、メッセージが表示されると、すべての改行はスペースのように見えます(<br />
はありません)。他の不一致の例があるかもしれませんが、私はまだ知りません。
これに対処する最も適切な方法は何でしょうか。
データベースに格納されているテキストは問題ないと思います(たとえば、<
が<
に変換されていることがわかります)。したがって、主な問題はプレゼンテーションです。
Railsこれには組み込みヘルパーメソッドがありますか?
( simple_format は、私が必要としているものに似た動作をしますが、表示したくない<p>
タグを追加します。)
simple_format
は必要な処理を実行しないため、改行を<br>
sに変換する簡単なヘルパーメソッドを作成します。
def nl2br(s)
s.gsub(/\n/, '<br>')
end
次に、ビューで次のように使用できます。
<%= nl2br(h(@forum_post.message)) %>
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>"
テキストを囲むhtmlタグでstyle="white-space: pre-wrap;"
を使用できます。これは、テキストの改行を尊重します。
まだ誰かがここにリダイレクトされ、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>"
最も簡単なオプションの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>
別の方法は、テキストを<pre>
タグで囲むことです。そして、私のCSSオプションに関する最後の注記は、ここでも当てはまります。
<p>
<pre><%= your.text %></pre>
</p>
テキストを<pre>
タグからスペースまたは改行で区切らないでください。
この問題を少しグーグルで調べたところ、htmlアプローチはCSSのものよりクリーン度が低いと考えられているので、CSSを使用する必要があります。ただし、html-wayの方がブラウザ互換性が高いようです(古風なブラウザをサポートしていますが、誰でもかまいません)。
次のヘルパーは、改行を改行として保持し、HTMLまたはスクリプト(Javscriptなど)をプレーンテキストとしてレンダリングします。
def with_new_lines(string)
(h(string).gsub(/\n/, '<br/>')).html_safe
end
ビューでそのまま使用
<%= with_new_lines @object.some_text %>
white-space: pre-line
。したがって、次の行(\ n)でレンダリングされます。
私はRailsアプリでAceコードエディターを使用していて、コードを更新または作成するたびに、常に最初の行を除いてすべての行に余分なTABを追加するという問題がありました。私はできませんでした。 t gsubまたはjavascript replaceで解決します。しかし、そのテンプレートのレイアウトを無効にすると、誤って解決してしまいます。
だから、私はそれを解決しました
render :layout => false