как прочитать загруженный csv-файл в ruby on rails?

#ruby-on-rails

#рубин на рельсах

Вопрос:

Я создал каркас (друга) с простыми атрибутами, такими как имя и фамилия, а также я использую поле file_ для загрузки файла .csv, который содержит 1 столбец и 5 строк с некоторыми целыми числами.

_form.html.erb

 lt;%= form_with(model: friend, multipart: true) do |form| %gt;  lt;% if friend.errors.any? %gt;  lt;div id="error_explanation"gt;  lt;h2gt;lt;%= pluralize(friend.errors.count, "error") %gt; prohibited this friend from being saved:lt;/h2gt;   lt;ulgt;  lt;% friend.errors.each do |error| %gt;  lt;ligt;lt;%= error.full_message %gt;lt;/ligt;  lt;% end %gt;  lt;/ulgt;  lt;/divgt;  lt;% end %gt;   lt;div class="field"gt;  lt;%= form.label :first_name %gt;  lt;%= form.text_field :first_name %gt;  lt;/divgt;   lt;div class="field"gt;  lt;%= form.label :last_name %gt;  lt;%= form.text_field :last_name %gt;  lt;/divgt;   lt;div class="field"gt;  lt;%= form.label :File %gt;  lt;%= form.file_field :File %gt;  lt;/divgt;   lt;div class="actions"gt;  lt;%= form.submit %gt;  lt;/divgt; lt;% end %gt;   

показать.html.erb

 lt;p id="notice"gt;lt;%= notice %gt;lt;/pgt;  lt;pgt;  lt;stronggt;First name:lt;/stronggt;  lt;%= @friend.first_name %gt; lt;/pgt;  lt;pgt;  lt;stronggt;Last name:lt;/stronggt;  lt;%= @friend.last_name %gt; lt;/pgt;  lt;pgt;  lt;stronggt;Total:lt;/stronggt;  lt;%= @friend.total %gt; lt;/pgt;   lt;%= link_to 'Edit', edit_friend_path(@friend) %gt; | lt;%= link_to 'Back', friends_path %gt;   

чего я не понимаю, так это где прочитать загруженный csv-файл и вернуть его значение (после некоторых изменений в нем) в @friend.total

это мой контроллер

 class FriendsController lt; ApplicationController  before_action :set_friend, only: %i[ show edit update destroy ]   # GET /friends or /friends.json  def index  @friends = Friend.all  end   # GET /friends/1 or /friends/1.json  def show  end   # GET /friends/new  def new  @friend = Friend.new  end   # GET /friends/1/edit  def edit  end   # POST /friends or /friends.json  def create  @friend = Friend.new(friend_params)   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   # PATCH/PUT /friends/1 or /friends/1.json  def update  respond_to do |format|  if @friend.update(friend_params)  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   # DELETE /friends/1 or /friends/1.json  def destroy  @friend.destroy  respond_to do |format|  format.html { redirect_to friends_url, notice: "Friend was successfully destroyed." }  format.json { head :no_content }  end  end   private  # Use callbacks to share common setup or constraints between actions.  def set_friend  @friend = Friend.find(params[:id])  end   # Only allow a list of trusted parameters through.  def friend_params  params.require(:friend).permit(:first_name, :last_name, :total)  end end   

Я новичок в ruby on rails. пожалуйста, дайте мне знать, если я смогу подробнее описать проблему.

Комментарии:

1. Я знаю, что, поскольку мы отправляем запрос post, он должен быть обработан методом создания контроллера

2. Можете ли вы также показать свою модель другу, пожалуйста. В общем случае Rails предоставит загруженный файл в качестве объекта ввода params[:friend][:File] -вывода (вам действительно не следует использовать имена полей в верхнем регистре!), а create поместит его в соответствующий атрибут в вашей модели. если у вас есть настройки для вложений, такие как active-storage, carrierwave и т. Д., То система вложений возьмет их оттуда и позаботится о сохранности. если нет, вы можете получить sth, как lt;IO .... в вашей базе данных

3. вы делаете Friend.find и т. Д., Конечно, есть Friend модель

4. Вы задаете здесь несколько разных вопросов, и вам действительно нужно разобраться в этом и научиться чему-то одному за раз. 1. Как работать с загрузкой файлов. 2. Как проанализировать CSV-файл. 3. Как создать несколько записей в одном запросе. Мой совет здесь-пока пропустить эту функцию и сосредоточиться на выяснении основ, а затем вернуться к ней позже.

5. @MarianTheisen Я не думаю, что AS или Carrierwave на самом деле здесь даже уместны. Это очень расплывчатый вопрос без четкого требования, но я сомневаюсь, что он действительно хочет прикрепить файл к модели — скорее, просто обработать его немедленно.