Ruby on Rails中表单绑定对象时scoped的含义是什么?
Rails form_with 中 ":model" 参数的 "scoped" 含义解析
这里的"scoped"和你熟悉的变量作用范围不是一个概念,它特指表单构建器被限定绑定到指定的模型实例,会触发一系列和该模型关联的自动行为:
- 自动匹配RESTful路由:表单的提交路径(
action)会自动对应模型的标准路由,比如绑定新建的@post时,指向posts_path;绑定已存在的@post时,指向post_path(@post),不用手动写url参数。 - 字段自动填充模型数据:表单里的字段会直接读取模型实例的属性值,比如
f.text_field :title会显示@post.title的内容,编辑场景下不用手动赋值。 - 提交参数自动嵌套:表单提交后的参数会被包裹在模型名对应的键下,比如
params[:post][:title],这样控制器里可以直接用强参数规范处理,比如Post.new(params.require(:post).permit(:title))。 - 自动设置请求方法:如果是未保存的新实例(
@post = Post.new),表单用POST方法;如果是已持久化的实例,自动用PATCH/PUT方法,不用手动指定method。
举个实际代码例子:
# 控制器代码 def edit @post = Post.find(params[:id]) end # 视图中的表单 <%= form_with model: @post do |f| %> <%= f.text_field :title %> <%= f.text_area :content %> <%= f.submit %> <% end %>
这个表单会自动完成:
- 提交路径设为
/posts/1(对应post_path(@post)) - 使用
PATCH请求方法 - 自动填充
@post.title和@post.content的现有值 - 提交后参数结构为
{"post"=>{"title"=>"示例标题", "content"=>"示例内容"}, ...}
内容的提问来源于stack exchange,提问作者a.hess
相关产品推荐
相关产品推荐

