Rails脚手架表单仅展示指定属性,其余属性在单独视图录入的实现方案
嘿,这个需求很常见,我来给你两种靠谱的实现方式,你可以根据自己的场景选:
方法一:在共享表单里加动作判断(推荐,代码复用)
默认的_form.html.erb是new和edit视图共用的,我们只要在里面加个条件,判断当前是新建还是编辑动作,就能控制age字段的显示:
确保age字段允许空值
先确认数据库里age字段是可选的——如果刚生成脚手架还没迁移,打开迁移文件db/migrate/[timestamp]_create_people.rb,把age的定义改成:t.integer :age, null: true要是已经执行过迁移,就生成一个修改迁移:
rails g migration change_age_null_in_people然后在新迁移文件里写:
def change change_column_null :people, :age, true end跑一下
rails db:migrate让修改生效。修改共享表单局部视图
打开app/views/people/_form.html.erb,找到age字段的代码块,给它套个条件判断:<%# 只有在编辑页面才显示age输入框 %> <% if action_name == 'edit' %> <div class="field"> <%= form.label :age %> <%= form.number_field :age, placeholder: "可选" %> </div> <% end %>这样new视图渲染表单时就会自动隐藏age,edit视图正常显示。
确认强参数包含age
打开app/controllers/people_controller.rb,确保强参数里包含:age:def person_params params.require(:person).permit(:height, :weight, :age) end这个很重要,不然编辑页面提交age会被过滤掉。
方法二:新建独立的新建表单(适合表单差异大的场景)
如果以后新建和编辑表单的差异会越来越大,不如直接分开两个局部视图:
复制并修改新建表单
复制app/views/people/_form.html.erb,命名为_new_form.html.erb,然后删掉里面age字段的所有代码。修改new视图的渲染逻辑
打开app/views/people/new.html.erb,把原来的渲染代码改成:<%= render 'new_form', person: @person %>而
edit.html.erb保持原来的<%= render 'form', person: @person %>不变。
测试验证
最后记得测一下:
- 访问
/people/new,只能看到height和weight的输入框,提交后数据库里age为null - 访问某个person的编辑页面,能正常看到age输入框,填写后提交能成功保存
这样就完美满足你的需求啦!
内容的提问来源于stack exchange,提问作者Bad Programmer

