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

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

ただいまの
回答率

88.91%

【Rails】DBへの保存がうまくいかない

解決済

回答 1

投稿

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

Ponimaru

score 6

前提・実現したいこと

DBに適切に内容を保存したい。

発生している問題

保存に成功しているのに、sequel proには表示されていない。

フリマアプリの出品機能において、createアクションでDBに保存するよう指示をしていますが、sequel proで確認すると保存されていないようです。

保存が成功するとroot_pathに遷移するよう設定しているのですが、submitボタンを押した後は、しっかりroot_pathへ遷移しているのです。

試したこと

binding.pryによるデバッグを試みた。
terminal

imageテーブルを別に作ってあり、そこに画像が保存されるようにしているが、
"#<ActionDispatch::Http::UploadedFile:0x00007f8e38c7ce00>"
という形で入っていたのでそれにも原因があるのか調べたが、特に関連性はなさそうだった。
該当画像

該当のソースコード

#routes.rb

Rails.application.routes.draw do
  devise_for :users
  root "products#index"
  resources :products do
    member do
      get :purchase
    end
  end
end
#products_controller.rb

class ProductsController < ApplicationController
  # before_action :ensure_current_user, only: [:new, :create, :destroy]
  before_action :set_product, only: :destroy

  def index
    @products = Product.all
  end

  def new
    # if user_signed_in?
      @product = Product.new
      @product.images.new
    # else
    #   redirect_to root_path
    # end
  end

  def create
    #binding.pry
    @product = Product.new(product_params)
    if @product.images.present?
      @product.save
      redirect_to root_path
    else
      render :new
    end
  end

  def destroy
    if @product.delete
      redirect_to products_path, notice: '削除されました'
    else 
      render :index
    end
  end

  def purchase
    @product_buyer= Product.find(params[:id])
    @product_buyer.update( buyer_id: current_user.id, status: "購入済み")
    redirect_to root_path
  end

  private
  def product_params
    params.require(:product).permit(:name, :price, :detail, :fee, :condition, :day, :size, :method, :brand_id, :prefecture_id, :user_id, :status, images_attributes: [:product_image,:_destroy,:id])
  end

  # def ensure_current_user
  #   product = Product.find(params[:id])
  #   if product.user_id != current_user.id
  #     flash[:notice] = "no authorization"
  #     redirect_to action: :index
  #   end
  # end

  def set_product
    @product = Product.find(params[:id])
  end
end
#product.rb

class Product < ApplicationRecord
  enum brand_id: {"シャネル": 0, 
                  "グッチ": 1, 
                  "プラダ": 2, 
                  "エルメス": 3, 
                  "バレンシアガ": 4, 
                  "フェンディ": 5, 
                  "ボッテガ・ヴェネタ": 6, 
                  "ヴァレンチノ": 7, 
                  "サン・ローラン": 8, 
                  "アルマーニ": 9 }

  enum size: {"XXS以下": 0, 
              "XS(SS)": 1, 
              "S": 2, 
              "M": 3, 
              "L": 4, 
              "XL(LL)": 5, 
              "2XL(3L)": 6, 
              "3XL(4L)": 7, 
              "4XL(5L)以上": 8, 
              "FREESIZE": 9 }

  enum condition: { "新品・未使用": 1, 
                    "未使用に近い": 2,
                    "目立った傷や汚れなし":3,
                    "やや傷や汚れあり":4,
                    "傷や汚れあり":5,
                    "全体的に状態が悪い":6 }

  enum fee: { "送料込み(出品者負担)":1, 
              "送料込み(出品者負担)":2, 
              "着払い(購入者負担)":3, 
              "着払い(購入者負担)":4 }

  enum day: { "1~2日で発送":1,  
              "2〜3日で発送":2,
              "4〜7日で発送":3 }

  enum method: {"メルカリ便":0, 
                "ヤマト":1, 
                "レターパック":2 }

  enum status: {"出品中":0, 
                "購入済み":1 }

  enum prefecture_id:{
    "北海道":1,     "青森県":2,     "岩手県":3,
    "宮城県":4,     "秋田県":5,     "山形県":6,
    "福島県":7,     "茨城県":8,     "栃木県":9,
    "群馬県":10,    "埼玉県":11,    "千葉県":12,
    "東京都":13,    "神奈川県":14,  "新潟県":15,
    "富山県":16,    "石川県":17,    "福井県":18,
    "山梨県":19,    "長野県":20,    "岐阜県":21,
    "静岡県":22,    "愛知県":23,    "三重県":24,
    "滋賀県":25,    "京都府":26,    "大阪府":27,
    "兵庫県":28,    "奈良県":29,    "和歌山県":30,
    "鳥取県":31,    "島根県":32,    "岡山県":33,
    "広島県":34,    "山口県":35,    "徳島県":36,
    "香川県":37,    "愛媛県":38,    "高知県":39,
    "福岡県":40,    "佐賀県":41,    "長崎県":42,
    "熊本県":43,    "大分県":44,    "宮崎県":45,
    "鹿児島県":46,  "沖縄県":47
  }

  belongs_to :user
  belongs_to :category
  has_many :images, dependent: :destroy
  accepts_nested_attributes_for :images, allow_destroy: true

  validates :name, :detail, presence: true
  validates :price, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 300, less_than_or_equal_to: 9999999}
  validates :fee, :condition, :day, :user_id, :prefecture_id, presence: true  #, :method
  validates :status, presence: true
  # validates :category_id, numericality: { only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: 13}

end
#image.rb

class Image < ApplicationRecord
  mount_uploader :product_image, ImageUploader
  belongs_to :product, optional: true
  validates :product_image, presence: true
end
#database.yml

# MySQL. Versions 5.5.8 and up are supported.
#
# Install the MySQL driver
#   gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
#   gem 'mysql2'
#
# And be sure to use new-style password hashing:
#   https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html
#
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: mercari_development

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: mercari_test

# As with config/credentials.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password as a unix environment variable when you boot
# the app. Read https://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full rundown on how to provide these environment variables in a
# production deployment.
#
# On Heroku and other platform providers, you may have a full connection URL
# available as an environment variable. For example:
#
#   DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase"
#
# You can use this database configuration with:
#
#   production:
#     url: <%= ENV['DATABASE_URL'] %>
#
production:
  <<: *default
  database: mercari_production
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
関連画像

product table
image table

補足情報

rails 6, mysql

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

その createでは saveに成功しようと失敗しようと root_pathに行きます。
(間違えて回答ボタン押してしまいました。。。)
Productが
  belongs_to :user   belongs_to :category
になっていますから、 user_id、category_idがないとvalidationではねられます。
viewがないので user_idが渡ってくるかどうかはここではわかりませんが、product_paramsにcategory_idがないので、こちらが欠けているのは明らかです。
これらが渡ってくるようにしてください

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/07 18:21

    他ブランチを自分のブランチに引っ張るテクニックとかあれば教えていただけると幸いです。
    なければ熱心に回答を下さったので一旦ベストアンサーにさせていただきます。

    キャンセル

  • 2020/07/07 18:28

    branch を pull したら全部載ります。
    Category関係だけ、というと それらのcommitをもれなく順序正しくになるので厄介。
    branchを取り寄せて、そこから必要なfileを取り出してcopyという安直な鳳凰もあるけど、後でプロジェクトにまとめるときに衝突の原因となるから、それらは自担当ブランチでcommitしないでおいて、トランクにmergeされるのを待つ。
    それをpullすると衝突するからそこで処理する

    キャンセル

  • 2020/07/07 18:52

    ありがとうございます!

    キャンセル

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

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

関連した質問

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