在 Rails 上使用 Ruby 在文本区域中保留换行符
Preserve newline in text area with Ruby on Rails
为了在 Rails 上练习 Ruby,我正在创建一个包含文本区域的博客(遵循 Mackenzie Child 的教程)。提交文本时,所有换行符都将被删除。我知道已经有人问过这个问题的变体,但尽管尝试了一整天,我还是无法复制任何结果。我对JQuery.
不是很熟悉
是否有一组步骤可以保留换行符?
_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
实际上保留了换行符(如 \r\n
),您只是在 index/show 视图中看不到它们。
在这些视图中,在您的 post.body
字段上调用 simple_format
以将 \n
s 替换为 <br>
s(HTML 换行符):
simple_format(post.body)
来自文档:
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.
一个更简单(我敢说更好)的处理方法是将此 CSS 样式应用到段落或类似的 HTML 元素,您用来在其中显示用户输入。
white-space: pre-wrap;
一个优点是,这将像 simple_format
一样保留换行符,而无需添加它应用的额外格式,例如将两个连续的换行符字符转换为段落元素或自动将换行符添加到内容的末尾。在一个类似的项目中,我自己刚刚从使用 simple_format
切换到这个。更可预测。
我同意 Gino 的回答,除了我发现使用:
white-space: pre-line
而是帮助我消除了电子邮件第一行开头不必要的空格。
参考:https://developer.mozilla.org/en-US/docs/Web/CSS/white-space
为了在 Rails 上练习 Ruby,我正在创建一个包含文本区域的博客(遵循 Mackenzie Child 的教程)。提交文本时,所有换行符都将被删除。我知道已经有人问过这个问题的变体,但尽管尝试了一整天,我还是无法复制任何结果。我对JQuery.
不是很熟悉是否有一组步骤可以保留换行符?
_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
实际上保留了换行符(如 \r\n
),您只是在 index/show 视图中看不到它们。
在这些视图中,在您的 post.body
字段上调用 simple_format
以将 \n
s 替换为 <br>
s(HTML 换行符):
simple_format(post.body)
来自文档:
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.
一个更简单(我敢说更好)的处理方法是将此 CSS 样式应用到段落或类似的 HTML 元素,您用来在其中显示用户输入。
white-space: pre-wrap;
一个优点是,这将像 simple_format
一样保留换行符,而无需添加它应用的额外格式,例如将两个连续的换行符字符转换为段落元素或自动将换行符添加到内容的末尾。在一个类似的项目中,我自己刚刚从使用 simple_format
切换到这个。更可预测。
我同意 Gino 的回答,除了我发现使用:
white-space: pre-line
而是帮助我消除了电子邮件第一行开头不必要的空格。
参考:https://developer.mozilla.org/en-US/docs/Web/CSS/white-space