Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Preserve newline in text area with Ruby on Rails

Tags:

To practice Ruby on Rails, I am creating a blog which includes a text area (following Mackenzie Child's tutorial). When the text is submitted, all of the newlines are removed. I know variations of the question have been asked already, but I have been unable to replicate any of the results despite an entire day trying. I am not very familiar with JQuery.

Is there a set of steps that will preserve the newlines?

_form.html.erb

<div class="form">     <%= form_for @post do |f| %>         <%= f.label :title %><br>         <%= f.text_field :title %><br>         <br>         <%= f.label :body %><br>         <%= f.text_area :body %><br>         <br>         <%= f.submit %>     <% end %> </div> 

posts_controller.rb

class PostsController < ApplicationController before_action :authenticate_user!, except: [:index, :show]  def index     @posts = Post.all.order('created_at DESC') end  def new     @post = Post.new end  def create     @post = Post.new(post_params)      @post.save     redirect_to @post end  def show     @post = Post.find(params[:id]) end  def edit     @post = Post.find(params[:id]) end  def update     @post = Post.find(params[:id])      if @post.update(params[:post].permit(:title, :body))         redirect_to @post     else         render 'edit'     end end  def destroy     @post = Post.find(params[:id])     @post.destroy      redirect_to posts_path end  private      def post_params         params.require(:post).permit(:title, :body)     end end 
like image 840
anon Avatar asked Feb 08 '15 18:02

anon


People also ask

How do you do a line break in Ruby?

\r\n should probably do the trick.

How do I add a new line in rails?

You can add line feed in string simply by adding “\r\n” or “\n”.


2 Answers

Newlines are actually being preserved(as \r\n), you just don't see them in your index/show views.

In these views, call simple_format on your post.body field to replace \ns with <br>s(HTML newlines):

simple_format(post.body) 

From docs:

simple_format(text, html_options = {}, options = {}) public  Returns text transformed into HTML using simple formatting rules. Two or more consecutive newlines(\n\n) are considered as a paragraph and wrapped  in <p> tags. One newline (\n) is considered as a linebreak and a <br /> tag is  appended. This method does not remove the newlines from the text. 
like image 127
Rustam A. Gasanov Avatar answered Sep 28 '22 09:09

Rustam A. Gasanov


An easier (and dare I say better) way to handle this is to apply this CSS style to the paragraph or similar HTML element that you use to display user input inside of.

white-space: pre-wrap; 

One advantage is this will persevere newlines just like simple_format without adding the extra formatting that it applies, such as turning two consecutive newlines characters into a paragraph element or automatically adding newlines to the end of the content. Just switched from using simple_format to this myself in a similar project. Way more predictable.

like image 39
Gino Avatar answered Sep 28 '22 09:09

Gino