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

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

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

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

MySQL

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

Ruby on Rails

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

データベース

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

2回答

8086閲覧

Rails 投稿内容が保存されない

TaaShii

総合スコア5

Ruby

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

MySQL

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

Ruby on Rails

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

データベース

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

1クリップ

投稿2020/05/15 23:45

解決したいこと

インスタライクなアプリを制作しており、投稿内容がデータベースに保存されません。
投稿内容は、tag、title、image、textになります。
tagは、予めデータベース保存している6項目をformのcollection_selectで選択するようにしています。

発生している問題・エラーメッセージ

エラーは発生せず、createアクション内の条件分岐でelseにより、元のページに戻されてしまいます。
データベースには何も保存されていません。

new.html.erb

ruby

1<div class="contents row"> 2 <div class="container"> 3 <%= form_with(model: @post, local: true) do |form| %> 4 <h2>投稿する</h2> 5 <%= form.collection_select :tags_ids, Tag.all, :id, :name, :prompt => "カテゴリーを選択して下さい" %> 6 <%= form.text_field :title, placeholder: "タイトル" %> 7 <%= form.file_field :image, placeholder: "写真のURL" %> 8 <%= form.text_area :text, placeholder: "投稿内容" , rows: "10" %> 9 <%= form.submit "送 信" %> 10 <% end %> 11 </div> 12</div>

seed.rb

ruby

1~省略~ 2 3Tag.create([ 4 { name: '風景' }, 5 { name: 'バイク' }, 6 { name: 'カスタム' }, 7 { name: 'マップ' }, 8 { name: 'グルメ' }, 9 { name: '宿、ホテル' } 10])

posts_controller.rb

ruby

1 def new 2 @post = Post.new 3 end 4 5 def create 6 @post = Post.new(post_params) 7 if @post.save 8 redirect_to root_path 9 else 10 render :new 11 end 12 end 13 14~省略~ 15 16 private 17 def post_params 18 params.require(:post).permit(:tag, :title, :text, :image).merge(user_id: current_user.id) 19 end

post.rb

ruby

1class Post < ApplicationRecord 2 validates :tag, :title, :text, :image, presence: true 3 belongs_to :user 4 has_many :post_tags, dependent: :destroy 5 has_many :tags, through: :post_tags 6 7 mount_uploader :image, ImageUploader 8end

tag.rb

ruby

1class Tag < ApplicationRecord 2 has_many :post_tags, dependent: :destroy 3 has_many :posts, through: :post_tags 4end

migrate/_create_posts.rb

ruby

1class CreatePosts < ActiveRecord::Migration[5.2] 2 def change 3 create_table :posts do |t| 4 t.string :title 5 t.text :text 6 t.string :image 7 t.timestamps 8 end 9 end 10end

migrate/_create_tags.rb

ruby

1class CreateTags < ActiveRecord::Migration[5.2] 2 def change 3 create_table :tags do |t| 4 t.string :name 5 t.timestamps 6 end 7 end 8end

migrate/_add_tag_to_posts.rb

ruby

1class AddTagToPosts < ActiveRecord::Migration[5.2] 2 def change 3 add_column :posts, :tag, :string 4 end 5end

binding.pry後のパラメーター

terminal

1<ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"OA+BMUWJpLSbpkhO7wlyNeBmqXodoWTyqQYd809VUuKTu6hMm6hSKynBj1aE7mOUYu3UmOKMt3M+yA6lCYK3kg==", "post"=><ActionController::Parameters {"tags_ids"=>"1", "title"=>"テスト", "image"=>#<ActionDispatch::Http::UploadedFile:0x00007fef92f6f7f0 @tempfile=#<Tempfile:/var/folders/b9/nlkpx4jd5plg9fbf9dpp648h0000gn/T/RackMultipart20200516-9745-19ak7j0.jpeg>, @original_filename="3A866F5C-61CC-443A-9643-466184FDCF23_1_105_c.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"post[image]\"; filename=\"3A866F5C-61CC-443A-9643-466184FDCF23_1_105_c.jpeg\"\r\nContent-Type: image/jpeg\r\n">, "text"=>"test"} permitted: false>, "commit"=>"送 信", "controller"=>"posts", "action"=>"create"} permitted: false>

試したこと

save!メソッドにより、エラーの原因を探りました。
Validation failed: Tag can't be blank
エラー画面によるとtagが空であると出ます。
パラメーターでは取得できていると思うのですが。
解決法やエラーの原因がわからず困っています。
ご助力よろしくお願いします。

save!メソッドの結果

https://gyazo.com/b6a6372279e585d91a186fff839accc5

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

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

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

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

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

guest

回答2

0

ベストアンサー

構成に混乱と矛盾があります。
0. tagは一つですか多数ですか?

class Post < ApplicationRecord validates :tag, :title, :text, :image, presence: true has_many :post_tags, dependent: :destroy has_many :tags, through: :post_tags

とtagに関して二つの記述があります。
validatesからはtagはPostの項目であるかのように見えますが、残り2行はmodel Tagとの多対多に見えます。

  1. tagは一つですか多数ですか?

form.collection_select :tags_ids, とあるので、名前的には複数に取れますが複数選択可能なoptionがありません。
一つですか?

Tagは一つしかつけられないのか、複数つけられるのかによって回答が変わります。
どちらでしょう?

###ひとつだけなのでしたら
0. Postのtagは tag_id(integer)に替える
0. class Post のvalidates,has_many 3行は削除しbelongs_to :tagにする
ただし、tag無しでも良しとするならbelongs_to :tag, optional: true
0. form.collection_select :tags_ids, form.collection_select :tags_id,
0. permit(:tag, :title, :text, :image)permit(:tag_id, :title, :text, :image)

で行けるかな

投稿2020/05/16 01:07

編集2020/05/16 01:20
winterboum

総合スコア23284

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

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

TaaShii

2020/05/16 01:13

回答ありがとうございます。 1つの投稿に対して付けられるtagは1つ選択できるようにしています。
TaaShii

2020/05/16 09:41 編集

解決し、無事に投稿内容が保存できるようになりました。 原因は、大まかにいうと2つあリました。 1つ目は、投稿が一つに対してtagは一つしかつけられないのにtagsと複数形で登録や取得をしようとしていたこと。 ・postモデルのバリデーションのtags_idsをtag_idに修正 ・postとtagの多対多の関係になっていたアソシエーションを修正 2つ目は、tagは一つしかつけられないので、投稿postとのアソシエーションは多対一の関係であるのに中間テーブルを作ってしまっていたことにあった。 ・中間テーブルを削除
guest

0

以下の記事が参考になりませんでしょうか?

ruby

1@post = Post.new

の後、

ruby

1@post.tags.build

などが必要かと思われます。

また、Post モデルに accepts_nested_attributes_for を指定する必要があると思います。

View 作成時に子テーブルに入れる情報は、fields_for で指定する必要がありそうです。

まだ、不足事項があるかもしれませんが、一度、リンク先等を読んでみてください。

投稿2020/05/16 00:17

編集2020/05/16 00:21
Yasumichi

総合スコア1773

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

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

TaaShii

2020/05/16 01:14

回答ありがとうございます。 参考記事を読んで確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問