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

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

ただいまの
回答率

89.07%

Rails 変更した画像 表示されない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 558

14j126

score 9

Ruby on Railsでフリマアプリを作っています。

自分が既に出品した商品を編集できる機能を作り、編集はできるのですが、商品一覧ページを始め、編集で変更した画像が表示されません。

画像ではなく、#<actiondispatch::http::uploadedfile:0x00007f4f355c9730> と表示されます。
商品編集で画像を変更した場合、変更した画像が表示できるようにしたいです。
初心者のため、分かりづらい部分もあると思いますが、よろしくお願い致します。

関係がありそうな部分です。

product_edit.html.erb(商品編集ページ)

<div class="container">
  <div class="products">
    <ul class="edit_products_form">
      <%= form_for @product, url: product_edit_path(@product.id), method: :post do |f| %>
        <div class="field">
          <li><%= f.label :name, "商品名" %></li>
          <%= f.text_area :name %>
        </div>
        <div class="textarea_wrap">
          <li><%= f.label :description, "説明" %></li> 
          <%= f.text_area :description %>
        </div>
        <div class="field">
         <li><%= f.label :category, "カテゴリー" %></li>
         <%= f.collection_select :category, Category.all ,:id ,:name, include_blank: false %>
        </div>
        <div class="field">
          <li><%= f.label :price, "価格" %></li>
          <%= f.number_field :price, min: 0 %>
        </div>
        <div class="file_wrap">
          <li><%= f.label :image1, "画像1" %></li>
          <%= f.file_field :image1 %>
          <li><%= f.label :image2, "画像2" %></li>
          <%= f.file_field :image2 %>
          <li><%= f.label :image3, "画像3" %></li>
          <%= f.file_field :image3 %>
        </div>
        <div class="btn_wrap">
          <%= f.submit "送信する" %>
        </div>
      <% end %>
    </ul>
  </div>
</div>


products_controller.rb

  def product_edit
    @product = Product.find(params[:id])
    @category = Category.find(params[:id])
  end

  def product_update
    @product = Product.find(params[:id])
    @category = Category.find(params[:id])

    if params[:product][:image1]
      upload_file1 = params[:product][:image1]
      upload_file_name1 = upload_file1.original_filename
      output_dir = Rails.root.join('public', 'images')
      output_path = output_dir + upload_file_name1

      File.open(output_path, 'w+b') do |f|
       f.write(upload_file1.read)
      end
      @product.update(product_params.merge({image: upload_file1.original_filename}))
    end

    if params[:product][:image2]
      upload_file2 = params[:product][:image2]
      upload_file_name2 = upload_file2.original_filename
      output_dir = Rails.root.join('public', 'images')
      output_path = output_dir + upload_file_name2

      File.open(output_path, 'w+b') do |f|
       f.write(upload_file2.read)
      end
      @product.update(product_params.merge({image: upload_file2.original_filename}))
    end

    if params[:product][:image3]
      upload_file3 = params[:product][:image3]
      upload_file_name3 = upload_file3.original_filename
      output_dir = Rails.root.join('public', 'images')
      output_path = output_dir + upload_file_name3

      File.open(output_path, 'w+b') do |f|
       f.write(upload_file3.read)
      end
      @product.update(product_params.merge({image: upload_file3.original_filename}))
    end
  end

#商品一覧表示ページ
  def lists
    @products = Product.all
    @products = @products.order("id desc")
  end


routes.rb

  get '/users/products/(:id)/edit', to: 'products#product_edit', as: :product_edit
  post '/users/products/(:id)/edit', to: 'products#product_update', as: :product_update
  get '/', to:'products#lists', as: :lists


lists.html.erb

<div class="container"> 
  <% if @products.any? %>
    <div class="products">
      <ul>
        <% @products.each do |product| %>
          <li>
            <div class="image">
              <%= link_to markets_path(product.id) do %>
                <%= image_tag "/images/#{product.image1}" %>
              <% end %>
            </div>
          <p><%= product.name %></p>
          <p><%= product.price %></p>
          </li>
        <% end %>
      </ul>
    </div>
  <% else %>
    <p class="empty">対象の商品は見つかりませんでした。</p>
  <% end %>
</div>


Ruby on Rails
rails 5.1.7 使用

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

@product.update(product_params.merge({image: upload_file1.original_filename}))

の部分は、

@product.update(image1: upload_file1.original_filename)

でいい気かしますが。updateでimage1カラムだけ更新して、DBに保存されるので。

画像のカラム名はimage1~3ですよね?(前回質問されてたので...)

以上

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/08 00:52

    ありがとうございます。解決しました。今後ともよろしくお願いします!

    キャンセル

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

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る