現在rubyonrailsにてSNSサイトを作成しているものです。
##参考にしたサイト
最初、タグ付け機能はこちらRubyOnRailsで投稿アプリを作ろう②(画面作成編)のサイトを参考に作成しました。このとおりに関連テーブルを作成したところ、タグは表示されるのですが、タグ情報が保存されていないのか、絞り込みをしてもすべてのpostが表示されます。DBも作成済でデータも保存されているのであれば、なぜこうなるのか、解決方法がわかりません。
タグを選択した際、このようにURLが表示されますが、投稿一覧画面は変化なしでした。
##外部キーを追加してみましたが変わらず・・・
そこで、こちらRuby on Rails で多対多のモデルを構築した場合にハマったエラーを参考に外部キーを追加するなどして、エラー解除に取り組んでいるのですが、やはり変わらず、絞り込み表示機能が作用しません。
どなたかお力をお貸しいただける方、ご回答いただければ幸いです。
##環境
AWSのcloud9を使用しています。
rubyのバージョンは 2.4.1p111
railsのバージョンはRails 5.0.7 です。
##関連コード
post.rb
rb
1class Post < ApplicationRecord 2has_many :post_tag_relations, dependent: :delete_all, foreign_key: 'post_id' 3has_many :tags, through: :post_tag_relations 4end 5
tag.rb
rb
1class Tag < ApplicationRecord 2 has_many :post_tag_relations, dependent: :delete_all, foreign_key: 'tag_id' 3 has_many :posts, through: :post_tag_relations 4end 5
_form.html.erb
rb
1<div class="form-group"> 2 <span>タグ</span> 3 <%= f.collection_check_boxes(:tag_ids, Tag.all, :id, :name) do |tag| %> 4 <div class="form-check"> 5 <%= tag.label class: 'form-check-label' do %> 6 <%= tag.check_box class: 'form-check-input' %> 7 <%= tag.text %> 8 <% end %> 9 </div> 10 <% end %> 11</div>
posts_controller.rb
タグを保存されるように修正済。
rb
1def index 2 @posts = params[:tag_id].present? ? Tag.find(params[:tag_id]).posts : Post.all 3 @posts = Post.page(params[:page]) 4end 5 6 7def post_params 8 params.require(:post).permit(:title, :content, :picture, tag_ids: []) 9end
マイグレーションファイル(create_tags.rb)
rb
1class CreateTags < ActiveRecord::Migration[5.0] 2 def change 3 create_table :tags do |t| 4 t.string :name, null:false #nullを禁止 5 6 t.timestamps 7 end 8 end 9end
マイグレーションファイル(create_post_tag_relations.rb)
rb
1class CreatePostTagRelations < ActiveRecord::Migration[5.0] 2 def change 3 create_table :post_tag_relations do |t| 4 t.references :post, foreign_key: true 5 t.references :tag, foreign_key: true 6 7 t.timestamps 8 end 9 end 10end
ビュー(絞り込み機能の部分のみ抜粋)
rb
1<div class="ml-auto posts_button"> 2 <%= form_tag posts_path, method: :get, class: 'posts__searchForm' do %> 3 <%= select_tag :tag_id, 4 options_from_collection_for_select(Tag.all, :id, :name, params[:tag_id]), 5 { 6 prompt: 'タグで絞り込み', 7 class: 'form-control posts__select', 8 onchange: 'submit(this.form);' 9 } 10 %> 11 <% end %> 12
記述が不足している点がありましたら、コメント欄にてご指摘ください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/26 14:01