解決したいこと
インスタライクなアプリを制作しており、投稿内容がデータベースに保存されません。
投稿内容は、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!メソッドの結果
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/16 01:13
2020/05/16 09:41 編集