#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 на самом деле здесь даже уместны. Это очень расплывчатый вопрос без четкого требования, но я сомневаюсь, что он действительно хочет прикрепить файл к модели — скорее, просто обработать его немедленно.