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

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

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

Sequel Proは、Mac OS X向けMySQLフロントエンドです。GUIからのMySQLの操作・管理が可能になります。強力なクエリ編集、多彩なエンコーディングオプションのサポートなど多くの機能を備えています。

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1661閲覧

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

Ponimaru

総合スコア6

Sequel Pro

Sequel Proは、Mac OS X向けMySQLフロントエンドです。GUIからのMySQLの操作・管理が可能になります。強力なクエリ編集、多彩なエンコーディングオプションのサポートなど多くの機能を備えています。

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/07/07 02:28

前提・実現したいこと

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

発生している問題

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

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

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

試したこと

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

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

該当のソースコード

ruby

1#routes.rb 2 3Rails.application.routes.draw do 4 devise_for :users 5 root "products#index" 6 resources :products do 7 member do 8 get :purchase 9 end 10 end 11end 12

ruby

1#products_controller.rb 2 3class ProductsController < ApplicationController 4 # before_action :ensure_current_user, only: [:new, :create, :destroy] 5 before_action :set_product, only: :destroy 6 7 def index 8 @products = Product.all 9 end 10 11 def new 12 # if user_signed_in? 13 @product = Product.new 14 @product.images.new 15 # else 16 # redirect_to root_path 17 # end 18 end 19 20 def create 21 #binding.pry 22 @product = Product.new(product_params) 23 if @product.images.present? 24 @product.save 25 redirect_to root_path 26 else 27 render :new 28 end 29 end 30 31 def destroy 32 if @product.delete 33 redirect_to products_path, notice: '削除されました' 34 else 35 render :index 36 end 37 end 38 39 def purchase 40 @product_buyer= Product.find(params[:id]) 41 @product_buyer.update( buyer_id: current_user.id, status: "購入済み") 42 redirect_to root_path 43 end 44 45 private 46 def product_params 47 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]) 48 end 49 50 # def ensure_current_user 51 # product = Product.find(params[:id]) 52 # if product.user_id != current_user.id 53 # flash[:notice] = "no authorization" 54 # redirect_to action: :index 55 # end 56 # end 57 58 def set_product 59 @product = Product.find(params[:id]) 60 end 61end 62

ruby

1#product.rb 2 3class Product < ApplicationRecord 4 enum brand_id: {"シャネル": 0, 5 "グッチ": 1, 6 "プラダ": 2, 7 "エルメス": 3, 8 "バレンシアガ": 4, 9 "フェンディ": 5, 10 "ボッテガ・ヴェネタ": 6, 11 "ヴァレンチノ": 7, 12 "サン・ローラン": 8, 13 "アルマーニ": 9 } 14 15 enum size: {"XXS以下": 0, 16 "XS(SS)": 1, 17 "S": 2, 18 "M": 3, 19 "L": 4, 20 "XL(LL)": 5, 21 "2XL(3L)": 6, 22 "3XL(4L)": 7, 23 "4XL(5L)以上": 8, 24 "FREESIZE": 9 } 25 26 enum condition: { "新品・未使用": 1, 27 "未使用に近い": 2, 28 "目立った傷や汚れなし":3, 29 "やや傷や汚れあり":4, 30 "傷や汚れあり":5, 31 "全体的に状態が悪い":6 } 32 33 enum fee: { "送料込み(出品者負担)":1, 34 "送料込み(出品者負担)":2, 35 "着払い(購入者負担)":3, 36 "着払い(購入者負担)":4 } 37 38 enum day: { "1~2日で発送":1, 39 "2〜3日で発送":2, 40 "4〜7日で発送":3 } 41 42 enum method: {"メルカリ便":0, 43 "ヤマト":1, 44 "レターパック":2 } 45 46 enum status: {"出品中":0, 47 "購入済み":1 } 48 49 enum prefecture_id:{ 50 "北海道":1, "青森県":2, "岩手県":3, 51 "宮城県":4, "秋田県":5, "山形県":6, 52 "福島県":7, "茨城県":8, "栃木県":9, 53 "群馬県":10, "埼玉県":11, "千葉県":12, 54 "東京都":13, "神奈川県":14, "新潟県":15, 55 "富山県":16, "石川県":17, "福井県":18, 56 "山梨県":19, "長野県":20, "岐阜県":21, 57 "静岡県":22, "愛知県":23, "三重県":24, 58 "滋賀県":25, "京都府":26, "大阪府":27, 59 "兵庫県":28, "奈良県":29, "和歌山県":30, 60 "鳥取県":31, "島根県":32, "岡山県":33, 61 "広島県":34, "山口県":35, "徳島県":36, 62 "香川県":37, "愛媛県":38, "高知県":39, 63 "福岡県":40, "佐賀県":41, "長崎県":42, 64 "熊本県":43, "大分県":44, "宮崎県":45, 65 "鹿児島県":46, "沖縄県":47 66 } 67 68 belongs_to :user 69 belongs_to :category 70 has_many :images, dependent: :destroy 71 accepts_nested_attributes_for :images, allow_destroy: true 72 73 validates :name, :detail, presence: true 74 validates :price, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 300, less_than_or_equal_to: 9999999} 75 validates :fee, :condition, :day, :user_id, :prefecture_id, presence: true #, :method 76 validates :status, presence: true 77 # validates :category_id, numericality: { only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: 13} 78 79end

ruby

1#image.rb 2 3class Image < ApplicationRecord 4 mount_uploader :product_image, ImageUploader 5 belongs_to :product, optional: true 6 validates :product_image, presence: true 7end 8

ruby

1#database.yml 2 3# MySQL. Versions 5.5.8 and up are supported. 4# 5# Install the MySQL driver 6# gem install mysql2 7# 8# Ensure the MySQL gem is defined in your Gemfile 9# gem 'mysql2' 10# 11# And be sure to use new-style password hashing: 12# https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html 13# 14default: &default 15 adapter: mysql2 16 encoding: utf8 17 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 18 username: root 19 password: 20 socket: /tmp/mysql.sock 21 22development: 23 <<: *default 24 database: mercari_development 25 26# Warning: The database defined as "test" will be erased and 27# re-generated from your development database when you run "rake". 28# Do not set this db to the same as development or production. 29test: 30 <<: *default 31 database: mercari_test 32 33# As with config/credentials.yml, you never want to store sensitive information, 34# like your database password, in your source code. If your source code is 35# ever seen by anyone, they now have access to your database. 36# 37# Instead, provide the password as a unix environment variable when you boot 38# the app. Read https://guides.rubyonrails.org/configuring.html#configuring-a-database 39# for a full rundown on how to provide these environment variables in a 40# production deployment. 41# 42# On Heroku and other platform providers, you may have a full connection URL 43# available as an environment variable. For example: 44# 45# DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase" 46# 47# You can use this database configuration with: 48# 49# production: 50# url: <%= ENV['DATABASE_URL'] %> 51# 52production: 53 <<: *default 54 database: mercari_production 55 username: root 56 password: <%= ENV['DATABASE_PASSWORD'] %> 57 socket: /var/lib/mysql/mysql.sock

######関連画像
product table
image table

補足情報

rails 6, mysql

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

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

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

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

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

guest

回答1

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 02:41

編集2020/07/07 02:47
winterboum

総合スコア23347

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

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

Ponimaru

2020/07/07 03:40 編集

binding.pryを使ってcategory_idやuser_idに数値を入れてsaveしてもrollbackされます。 尚、下の画像はparamsに渡しそうとトライした結果です。 https://gyazo.com/28b5db86b1daa52fb8114d8a7d5e492a ちなみにエラーとしては NameError in ProductsController#create uninitialized constant Product::Category でした
winterboum

2020/07/07 04:48

model Category はどのfileでどのように定義してありますか?
Ponimaru

2020/07/07 08:37

model category はないです。 現在チームで開発していて他の方が担当してるパートにcategoryテーブルがあります。
winterboum

2020/07/07 09:09

ないとそのエラーになります。 現時点でCategoryが不要ならそれらをとりあえず隠して、という方法もありますが、書かれているということは必要ってことですから、チームのその部分をmergeしましょう
Ponimaru

2020/07/07 09:21

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

2020/07/07 09:28

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

2020/07/07 09:52

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問