画像を投稿画面(new)にアップロードし、
それを投稿(create)するとGoogle Map上にピンを立てて表示するアプリを開発しています。
現在は位置情報を緯度経度を手入力する方式で機能しているのですが、
画像から取得する方式に変更したいと考えています。
質問内容
①アップロードした画像から緯度・経度・撮影日時の情報の取得
②取得した情報をparamsで飛ばす方法
③飛ばした情報をDBのカラムに反映する方法
上を①から順に実現したいと考えています・・・
(ポイントが絞れておらずすみません)
前提
・画像アップロード機能にはActiveStorageとS3を組み合わせています。
・mini_exiftoolとexifrを試してみたのですが、記述方法がよく分からず挫折しました・・・
該当のソースコード
controller
1class StampsController < ApplicationController 2 before_action :set_stamp, only: [:show, :edit, :update, :destroy] 3 4 def index 5 @stamps = Stamp.all 6 end 7 8 def show 9 end 10 11 def new 12 @stamp = Stamp.new 13 end 14 15 def edit 16 end 17 18 def create 19 @stamp = Stamp.new(stamp_params) 20 21 respond_to do |format| 22 if @stamp.save 23 format.html { redirect_to @stamp, notice: 'Stamp was successfully created.' } 24 format.json { render :show, status: :created, location: @stamp } 25 else 26 format.html { render :new } 27 format.json { render json: @stamp.errors, status: :unprocessable_entity } 28 end 29 end 30 binding.pry 31 end 32 33 def update 34 respond_to do |format| 35 if @stamp.update(stamp_params) 36 format.html { redirect_to @stamp, notice: 'Stamp was successfully updated.' } 37 format.json { render :show, status: :ok, location: @stamp } 38 else 39 format.html { render :edit } 40 format.json { render json: @stamp.errors, status: :unprocessable_entity } 41 end 42 end 43 end 44 45 def destroy 46 @stamp.destroy 47 respond_to do |format| 48 format.html { redirect_to stamps_url, notice: 'Stamp was successfully destroyed.' } 49 format.json { head :no_content } 50 end 51 end 52 53 private 54 def set_stamp 55 @stamp = Stamp.find(params[:id]) 56 end 57 58 59 def stamp_params 60 params.require(:stamp).permit(:user_id, :title, :description, :shooted_at, :latitude, :longitude, :country, :image) 61 end 62end 63
html
1 <div class="new-container"> 2 <div class="content"> 3 <%= render 'form', stamp: @stamp %> 4 </div> 5 </div>
html
1<!--上の部分テンプレートです!--> 2<%= form_with(model: stamp, local: true) do |form| %> 3 <% if stamp.errors.any? %> 4 <div id="error_explanation"> 5 <h2><%= pluralize(stamp.errors.count, "error") %> prohibited this stamp from being saved:</h2> 6 7 <ul> 8 <% stamp.errors.full_messages.each do |message| %> 9 <li><%= message %></li> 10 <% end %> 11 </ul> 12 </div> 13 <% end %> 14 <div class="upload-content"> 15 <div class="image-area"> 16 <div class="field image-upload-area"> 17 <%= form.label :image %> 18 <%= form.file_field :image %> 19 </div> 20 </div> 21 22 <div class="text-area"> 23 <div class="field"> 24 <%= form.label :user_id %> 25 <%= form.number_field :user_id %> 26 </div> 27 28 <div class="field"> 29 <%= form.label :country %> 30 <select style="display: block" name="stamp[country]"> 31 <optgroup label="アジア"> 32 <option value="日本">日本</option> 33 <option value="韓国">韓国</option> 34 </optgroup> 35 <optgroup label="ヨーロッパ"> 36 <option value="イタリア">イタリア</option> 37 <option value="ドイツ">ドイツ</option> 38 </optgroup> 39 </select> 40 </div> 41 42 43 <div class="field"> 44 <%= form.label :title %> 45 <%= form.text_area :title %> 46 </div> 47 48 <div class="field"> 49 <%= form.label :description %> 50 <%= form.text_area :description %> 51 </div> 52 53 <!--写真から自動的に取得できるようにする--> 54 <div class="field"> 55 <%= form.label :shooted_at %> 56 <%= form.datetime_select :shooted_at %> 57 </div> 58 59 <!--国名か写真から自動で取得できるようにする--> 60 <div class="field"> 61 <%= form.label :latitude %> 62 <%= form.number_field :latitude %> 63 </div> 64 65 <!--国名か写真から自動で取得できるようにする--> 66 <div class="field"> 67 <%= form.label :longitude %> 68 <%= form.number_field :longitude %> 69 </div> 70 71 <div class="actions"> 72 <%= form.submit %> 73 </div> 74 </div> 75 </div> 76<% end %> 77
その他
まだteratail初心者で質問の仕方が分かっておらず,
情報不足などありましたらすみません。
「そもそも共有するコードが足りない!!」などあれば遠慮なく仰っていただければと思います!
あなたの回答
tips
プレビュー