末尾加空格

在 Rails 项目中,团队习惯使用 slim 格式 而非 erb 格式,对于 slim 格式,最大的特点就是缩进。

比如说,在 erb 格式中这样一段代码

<p>
  <b>slim</b>的最大特点是<b>缩进</b>
</p>

换成 slim 格式可以这么写:

p 
  b slim 
  | 的最大特点是
  b 缩进

通常中英文混排时,英文前后都应该留一个空格,在上述例子中,直接在 slim 末尾加空格是会被忽略掉的。可以使用传统的 HTML 空格符号 &nbsp

在 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 页面,这个标签信息一直被携带着。这样就能解决需求。