Ruby on Rails 如何读取上传的CSV文件并赋值给模型total字段
代码修改步骤
1. 引入CSV标准库
在FriendsController文件顶部加入引用:
require 'csv'
2. 调整强参数配置
修改控制器私有方法friend_params,允许上传的文件参数透传:
def friend_params params.require(:friend).permit(:first_name, :last_name, :total, :File) end
3. 新增创建场景的CSV处理逻辑
修改create方法,在初始化@friend之后、保存之前加入CSV读取计算逻辑:
def create @friend = Friend.new(friend_params) # 新增CSV处理逻辑开始 if params[:friend][:File].present? # 读取上传的临时CSV文件,默认无表头 csv_content = CSV.read(params[:friend][:File].tempfile, headers: false) # 提取第一列所有值转整数后求和,可根据你的实际处理需求修改此处逻辑 calculate_total = csv_content.map { |row| row[0].to_i }.sum @friend.total = calculate_total end # 新增CSV处理逻辑结束 respond_to do |format| if @friend.save format.html { redirect_to @friend, notice: "Friend was successfully created." } format.json { render :show, status: :created, location: @friend } else format.html { render :new, status: :unprocessable_entity } format.json { render json: @friend.errors, status: :unprocessable_entity } end end end
4. 新增更新场景的CSV处理逻辑
修改update方法,支持编辑时重新上传CSV更新total值:
def update @friend.assign_attributes(friend_params) # 新增CSV处理逻辑开始 if params[:friend][:File].present? csv_content = CSV.read(params[:friend][:File].tempfile, headers: false) calculate_total = csv_content.map { |row| row[0].to_i }.sum @friend.total = calculate_total end # 新增CSV处理逻辑结束 respond_to do |format| if @friend.save format.html { redirect_to @friend, notice: "Friend was successfully updated." } format.json { render :show, status: :ok, location: @friend } else format.html { render :edit, status: :unprocessable_entity } format.json { render json: @friend.errors, status: :unprocessable_entity } end end end
补充说明
- 若你还未给
friends表新增total字段,先执行以下命令生成迁移:rails g migration AddTotalToFriends total:integer rails db:migrate - 表单中的文件字段命名建议改为小写
csv_file,避免大小写敏感带来的不必要问题,修改后对应调整强参数和逻辑中的参数名即可。 - 可根据需求新增文件校验逻辑,比如限制仅允许
.csv格式上传、校验文件行数符合要求等。
内容的提问来源于stack exchange,提问作者Diwanshu Tyagi
相关产品推荐
相关产品推荐

