質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

297閲覧

Ruby On Railsでjs.erbから画像データを更新するとnilになります。

s_diff

総合スコア107

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2018/08/03 06:44

Ruby On Railsでjs.erbから画像データを更新するとnilになります。

まずshow.html.erbからprepare_sample_img.js.erbに飛ばしてinnerHTMLでフォームを出現させています。

ruby

1#/mypage/requests/show.html.erb 2 3<div id='sample_img' class="request-detail"> 4 <% if @request.sample_img.present? %> 5 <%= image_tag @request.sample_img, class: "floor-plan-img-in-mypage-requests-show" %> 6 <% else %> 7 なし 8 <% end %> 9 <%= link_to "変 更", prepare_sample_img_mypage_request_path(id: @request.id), class: "btn-modify", remote: true %> 10 </div>

ruby

1#/config/routes.rb 2 3Rails.application.routes.draw do 4 namespace :mypage do 5 resources :requests do 6 member do 7 get 'prepare_sample_img' 8 get 'update_sample_img' 9 end 10 end 11 end 12end 13

ruby

1#/mypage/requests_controller.rb 2 3class Mypage::RequestsController < Mypage::ApplicationController 4 before_action :set_request, only: [:show, :prepare_sample_img,:update_sample_img] 5 6def create 7 @request = Request.new(request_params) 8 @request.user_id = current_user.id 9 respond_to do |format| 10 if @request.valid? 11 building = Building.where(name: @request.name).first_or_create do |row| 12 row.name = @request.name 13 row.address = @request.address 14 end 15 @request.building_id = building.id 16 @request.save(validate: false) 17 format.html { redirect_to mypage_requests_path, notice: '作成しました' } 18 format.json { render :show, status: :created, location: @request } 19 else 20 format.html { render :new } 21 format.json { render json: @request.errors, status: :unprocessable_entity } 22 end 23 end 24 end 25 26 def prepare_sample_img 27 end 28 29 def update_sample_img 30 if @request.update(sample_img: params[:request][:sample_img]) 31 redirect_to mypage_request_path(@request), notice: "変更しました。" 32 else 33 redirect_to mypage_request_path(@request), alert: "変更できませんでした" 34 end 35 end 36 37 private 38 39 def request_params 40 params.fetch(:request, {}).permit(:name, :no, :address, :floor, :station, :current, :schedule, :key_place, :person, :remark, :neighbor_flg, :panorama_flg, :floor_plan) 41 end 42 43 def set_request 44 @request = Request.find_by(id: params[:id]) 45 end 46end

ruby

1#/mypage/requests/prepare_sample_img.js.erb 2 3var sample_img = document.getElementById("sample_img"); 4 5sample_img.innerHTML = '<form style="height:32px; width:350px;"'+ 6 'action="/mypage/requests/<%= @request.id %>/update_sample_ing" method="get">'+ 7 '<input type="file" name="request[sample_img]" id="request_sample_img" autocomplete="off">'+ 8 '<input type="hidden" name="id" value="<%= @request.id %>">'+ 9 '<input class="btn-submit2" type="submit" value="更 新"></form>'

上のフォームを送信するとparams[:request][:sample_img]は渡ってくるのですが、updateメソッド後のsample_imgを調べたところ、nilでした。

ruby

1#model/request.rb 2 3class Request < ActiveRecord::Base 4 mount_uploader :sample_img, ImageUploader 5end

ruby

1#uploders/image_uploder.rb 2 3class ImageUploader < CarrierWave::Uploader::Base 4 include CarrierWave::MiniMagick 5 def store_dir 6 "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 7 end 8 9 def extension_white_list 10 %w(jpg jpeg gif png zip) 11 end 12 13 def filename 14 "#{secure_token}.#{file.extension}" if original_filename.present? 15 end 16 17 protected 18 def secure_token 19 var = :"@#{mounted_as}_secure_token" 20 model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid) 21 end 22 23end

createしたときは問題なくsample_imgカラムにデータが入るのですが、そのデータをshow.html.erbで別の画像に更新しようとしたところ、インスタンスのupdate自体は成功し、sample_imgはnilになってしまいます。

エラーログが出ず、ただsample_imgカラムがnilになるので解決策を見つけるのが難しいです。

何卒、間違いのご指摘の方よろしくおねがいいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

更新の場合はPUTもしくはPATCHでリクエストするようにしてください。
GETの場合、パラメータを渡してもクエリパラメータとして送信されるため文字数制限があり、
画像のようなデータは送ることができないかと。

Railsに届いているパラメータをログなどで確認して見てください。

あと、タイポもしくはコピーミスだと思いますが、

sample_img.innerHTML = '<form style="height:32px; width:350px;"'+ 'action="/mypage/requests/<%= @request.id %>/update_sample_ing" method="get">'+ '<input type="file" name="request[sample_img]" id="request_sample_img" autocomplete="off">'+ '<input type="hidden" name="id" value="<%= @request.id %>">'+ '<input class="btn-submit2" type="submit" value="更 新"></form>'

のactionで指定しているURLが間違ってるように見えます。

投稿2018/08/03 08:44

satoshih

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s_diff

2018/08/03 10:03 編集

ご返信ありがとうございます。 タイポミスです、申し訳ありません。(☓ update_sample_ing → ○ update_sample_imgです。) 具体的にどの部分のリクエストメソッドをPUTかPATCHに変えれば良いでしょうか? 何通りかの方法を試してみました。 1. ルーティングを変更(patch 'update_sample_img') → handle_404がレンダリングされる 2. sample_img.innerHTML内のmethodを変更(method="patch")→ 更新しても変化なし 3. 1と2の両方 handle_404がレンダリングされる patchをputにしても結果は同じでした。 またhttpメソッドを変更してもrailsサーバーのログには特に変化がないように見えます。
s_diff

2018/08/04 00:33 編集

次の点をご参考にしていただけると何かご指摘していただけることが見つかるかもしれません。 1.もともと画像があった場合、画像ファイルを選んで更新するとnilになる → js.erbを介したあとupdate_sample_imgメソッドの中でparams[:floor_plan]は渡って来ている。 → コンソールを見る限りsaveした際にマウントはされている → 一回マウントをコメントアウトして新しくリクエストしてみると当然アップロードされないが、画像のアイコンとactiondispatchが出る。 :floor_plan => "#<ActionDispatch::Http::UploadedFile:0x007f92e1439448>" → そこから更新すると選択したファイルのファイル名が入る。当然アップロードはされてない。 → マウントをつけ直して画面を更新し、コンソールで確認するとマウントされた形跡がある。 → 一旦rails sやmysql等を全部消す → 全部立て直してコンソールで確認するとマウントされてるしファイル名も正しいけどアップロードされてない → Request.last.sample_img.pathでパスが表示されるのにじっさいにはファイルはない → update_sample_imgの中を通るとアップロードされないのに画像が消える? ということを試してみました。なにかご指摘していただけることがあれば、何卒よろしくおねがいします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問