最近用到的两个小技巧
末尾加空格
在 Rails 项目中,团队习惯使用 slim 格式 而非 erb 格式,对于 slim 格式,最大的特点就是缩进。
比如说,在 erb 格式中这样一段代码
<p>
<b>slim</b>的最大特点是<b>缩进</b>
</p>
换成 slim 格式可以这么写:
p
b slim
| 的最大特点是
b 缩进
通常中英文混排时,英文前后都应该留一个空格,在上述例子中,直接在 slim
末尾加空格是会被忽略掉的。可以使用传统的 HTML 空格符号  
。
在 slim 格式中,有一个简单的语法,就是在末尾加一个单引号 '
就能达到末尾增加空格的效果。
path 中加锚点
在一个网页的底部有一个表单,用户提交表单的时候,如果后端验证不通过,会返回该页面,但是一般是停留在网页的顶部。这样的体验很糟糕。我们希望如果验证不通过,能够定位到表单位置,让用户直接修改表单。
首先想到的是加前端验证,比如用 Boostrap Validator 。这样的话,在验证通过之前,表单都不会被提交,自然就不会发生跳转到网页顶部的问题。
但是前端验证毕竟不可靠,后端的验证还是得有。
# /posts/new.html.slim
- simple_form_for @post do |f|
= f.input :name
= f.input :content
= f.submit
# posts_controller.rb
def new
@post = Post.new
end
def create
@post = Post.new(params.require(:post).permit(:name, :content))
if @post.save
redirect_to posts_path
else
render :new
end
end
如果后端验证不通过,就会执行 render :new
,就是带着所有信息返回到 new 页面,错误信息就会显示出来。
要定位到网页的某个位置,方法很简单,首先在想要的位置处加一个标签,比如 #form
,然后在网址里加这个标签就可以了。比如 http://example.com#form
。现在的问题是,如何把这个标签塞在 render :new
这个语句里。
答案是,在提交表单的时候增加一个 url
的参数。
# /posts/new.html.slim
- simple_form_for @post, url: '/posts#form' do |f|
= f.input :name
= f.input :content
= f.submit
这个写法显然不太符合 Rails 的风格,可以把 url
参数的值换成 Rails 中的 helper: posts_path(anchor: 'form')
,这样得到的网址就是 http://example.com/posts#form
。
把标签跟着表单一起提交,验证不通过时,再通过执行 render: new
来到 new 页面,这个标签信息一直被携带着。这样就能解决需求。