Sinatra应用新增:description列后,如何重构POST请求代码?
搞定Sinatra列表的description字段添加与代码重构
嘿,刚接触Sinatra的话,这个需求其实挺常见的,我来帮你一步步梳理清楚~
1. 先给List表添加description字段
首先得在数据库里新增这个列,用ActiveRecord迁移来做最稳妥:
- 生成迁移文件:
rake db:create_migration add_description_to_lists - 打开生成的迁移文件,添加字段代码(如果需要支持长文本就用
:text,短文本用:string):class AddDescriptionToLists < ActiveRecord::Migration[6.1] def change add_column :lists, :description, :text end end - 运行迁移生效:
rake db:migrate
2. 更新List模型的参数验证逻辑
你代码里的List.valid_params?方法是用来校验提交参数的,现在要把description的校验逻辑加进去。假设原来的方法只检查name,现在可以根据需求调整:
class List < ActiveRecord::Base # 其他模型代码... def self.valid_params?(params) # 如果description允许为空,只校验name必填: params.key?("name") && !params["name"].blank? # 如果要求description也必填,就改成: # params.key?("name") && !params["name"].blank? && params.key?("description") end end
3. 重构POST请求里的update代码
原来的params.select{|k|k== "name"}写法太啰嗦了,Sinatra(依托ActiveSupport)有个更简洁的slice方法,专门用来提取指定的参数键,直接把需要的字段传进去就行。重构后的完整POST请求代码如下:
post "/lists/:id" do redirect_if_not_logged_in @list = List.find(params[:id]) unless List.valid_params?(params) flash[:error] = "请填写必要的列表信息!" redirect "/lists/#{@list.id}/edit" end # 用slice替代繁琐的select,同时加入description字段 if @list.update(params.slice("name", "description")) redirect "/lists/#{@list.id}" else flash[:error] = "更新列表失败,请检查输入格式!" erb :"lists/edit" end end
为什么用slice?
- 代码更简洁,可读性更强,一眼就能看出允许更新的字段是
name和description - 本质上和你的select逻辑一致,但属于Ruby生态里的标准写法,维护起来更方便
- 能避免意外更新其他不需要的参数,相当于做了简单的参数白名单过滤
内容的提问来源于stack exchange,提问作者JenHop
相关产品推荐
相关产品推荐

