同じ日の投稿や都道府県、値段の一覧ページを作る方法
この記事ではunless文を使用することで選択された投稿の特定のカラムと同じ内容のカラムを持った投稿のみを表示する方法を説明します。
例として都道府県を入力するカラム(prefecture)を作成して、その都道府県をクリックすることで同じ都道府県の投稿を一覧表示させるページに飛べるようにしたいと思います。
基本的にprefectureと書いてある部分を自分の指定したいカラムに変更していただければ結構です!
1. 指定された都道府県(prefecture)の一覧ページをviewに作成する
app/view/tweetsを右クリックしてNew Fileを選択、matome.html.erbを作成。
2.routes.rbで新しく作ったページのルーティングをする
※注意!resorce:tweetsよりも下の行に書いてください!!routes.rbは上から読み込まれるためエラーが起きてしまいます!
get "tweets/matome/:id" => "tweets#matome", as: :tweet_matome
/:idを後ろにつけることでクリックされた投稿のtweetidを取得できるように、as: :tweets_matomeと記入することで今回作ったパスのPrefixをtweet_matomeにしています。
3.index・showページから1.で作成したmatomeページへのリンクを作成する。
<%= link_to t.prefecture, tweet_matome_path(t.id) %>
t.prefectureで表示されるリンク名をそれぞれの投稿の都道府県名に、2.で作成したPrefixのtweet_matomeに_pathをつけることで1.で作成したページに飛ぶようにしています!後ろの(t.id)で投稿のidを紐づけることを忘れないでください!
4.controllerでアクションを設定する
def matome
@tweets = Tweet.all
@tweet = Tweet.find(params[:id])
end
@tweetsで全ての投稿の情報を取得、@tweetで3.のリンクでクリックされた投稿の情報だけを取得します。
5.まとめ用ページのviewを作成
<% @tweets.each do |t| %>
<% unless @tweet.prefecture == t.prefecture %>
<% else %>
<%= link_to t.name, tweet_path(t.id) %>
<% end %>
<% end %>
上の@tweets.each doで全ての投稿を表示した後にunless @tweet.prefecture == t.prefectureで3.のリンクでクリックされた投稿のprefectureと全ての投稿のprocedureが一致しているかチェックして prefectureの内容が一致している投稿のみを表示するようにしています。
link_to t.name, tweet_path(t.id)はprefectureが一致した投稿の一覧を表示するところなので、基本的にはindexページに書いているeach doの中身をそのままコピーペーストしていただいて結構です。この例ではnameカラムを表示するようにしています。
例2:全部手動で書く&こちらで入力の形式を絞る形式
1. 既存のテーブルに都道府県用のカラムを追加する
今回はぱっと見でもわかりやすいようにtodouhukenとローマ字で作成します。
rails g migration AddTodouhukenToTweets todouhuken:string
#tweetsテーブルにデータ型がstringのtodouhukenっていうカラムを追加して〜っていう指示書を作成
rails db:migrate
#さっき作った指示書を実行
rails c
#カラムを増やしたから既存の投稿を全消ししにいきます
Tweet.destroy_all
#tweetsテーブルの投稿を全消し
exit
#いつものターミナル画面に戻る
2. new.html.erbに都道府県の投稿フォームを追加する。
#追加ここから
<%= f.label :都道府県 %>
<%= f.select :todouhuken,
[["北海道", "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"]], include_blank: "選択して下さい" %>
#追加ここまで
<%= f.submit "Tweetする" %>
<% end %>
3.routes.rbで新しく作ったページのルーティングをする
※注意!resorce:tweetsよりも下の行に書いてください!!routes.rbは上から読み込まれるためエラーが起きてしまいます!
get "tweets/matome/:todouhuken" => "tweets#matome", as: :tweet_matome
/:todouhukenって後ろについていますね。
では例えば北海道[1]の投稿ページを表示したい場合のURLはどうなるのかというと[http://localhost:3000/tweets/matome/1]となります。5.の作業で設定する@tweetを使うことでURLに入っているこの1という数字を持ってきます。
また、文末にas: :tweets_matomeと記入することで今回作ったパスのPrefixをtweet_matomeにしています。
4.indexページからmatomeページへのリンクを作成する。
<%= link_to "北海道の一覧", tweet_matome_path(1) %>
<%= link_to "秋田県の一覧", tweet_matome_path(2) %>
<%= link_to "青森県の一覧", tweet_matome_path(3) %>
<%= link_to "岩手県の一覧", tweet_matome_path(4) %>
<%= link_to "宮城県の一覧", tweet_matome_path(5) %>
<%= link_to "山形県の一覧", tweet_matome_path(6) %>
<%= link_to "福島県の一覧", tweet_matome_path(7) %>
<%= link_to "茨城県の一覧", tweet_matome_path(8) %>
<%= link_to "栃木県の一覧", tweet_matome_path(9) %>
<%= link_to "群馬県の一覧", tweet_matome_path(10) %>
<%= link_to "埼玉県の一覧", tweet_matome_path(11) %>
<%= link_to "千葉県の一覧", tweet_matome_path(12) %>
<%= link_to "東京都の一覧", tweet_matome_path(13) %>
<%= link_to "神奈川県の一覧", tweet_matome_path(14) %>
<%= link_to "新潟県の一覧", tweet_matome_path(15) %>
<%= link_to "富山県の一覧", tweet_matome_path(16) %>
<%= link_to "石川県の一覧", tweet_matome_path(17) %>
<%= link_to "福井県の一覧", tweet_matome_path(18) %>
<%= link_to "山梨県の一覧", tweet_matome_path(19) %>
<%= link_to "長野県の一覧", tweet_matome_path(20) %>
<%= link_to "岐阜県の一覧", tweet_matome_path(21) %>
<%= link_to "静岡県の一覧", tweet_matome_path(22) %>
<%= link_to "愛知県の一覧", tweet_matome_path(23) %>
<%= link_to "三重県の一覧", tweet_matome_path(24) %>
<%= link_to "滋賀県の一覧", tweet_matome_path(25) %>
<%= link_to "京都府の一覧", tweet_matome_path(26) %>
<%= link_to "大阪府の一覧", tweet_matome_path(27) %>
<%= link_to "兵庫県の一覧", tweet_matome_path(28) %>
<%= link_to "奈良県の一覧", tweet_matome_path(29) %>
<%= link_to "和歌山県の一覧", tweet_matome_path(30) %>
<%= link_to "鳥取県の一覧", tweet_matome_path(31) %>
<%= link_to "島根県の一覧", tweet_matome_path(32) %>
<%= link_to "岡山県の一覧", tweet_matome_path(33) %>
<%= link_to "広島県の一覧", tweet_matome_path(34) %>
<%= link_to "山口県の一覧", tweet_matome_path(35) %>
<%= link_to "徳島県の一覧", tweet_matome_path(36) %>
<%= link_to "香川県の一覧", tweet_matome_path(37) %>
<%= link_to "愛媛県の一覧", tweet_matome_path(38) %>
<%= link_to "高知県の一覧", tweet_matome_path(39) %>
<%= link_to "福岡県の一覧", tweet_matome_path(40) %>
<%= link_to "佐賀県の一覧", tweet_matome_path(41) %>
<%= link_to "長崎県の一覧", tweet_matome_path(42) %>
<%= link_to "熊本県の一覧", tweet_matome_path(43) %>
<%= link_to "大分県の一覧", tweet_matome_path(44) %>
<%= link_to "宮崎県の一覧", tweet_matome_path(45) %>
<%= link_to "鹿児島県の一覧", tweet_matome_path(46) %>
<%= link_to "沖縄の一覧", tweet_matome_path(47) %>
# 47都道府県分。tweet_matome_pathの中の数字はそれぞれ1ずつずらしておいて!
それぞれの都道府県名のURLをクリックすると、tweet_matome_pathの後ろの()内の数字がURLの:todouhukenのとこに送られてます。いくつかクリックしてURLをチェックしてみましょう。
5.controllerでアクションを設定する・privateにtodouhukenを追加する
def matome
@tweets = Tweet.all
@tweet = params[:todouhuken]
end
def tweet_params
params.require(:tweet).permit(:カラム名, :カラム名, ・・・, :todouhuken #todouhukenカラムを追加する)
end
@tweetsで全ての投稿の情報を取得、@tweetでURLから都道府県の数字を持ってきて逆算
5.まとめ用ページのviewを作成
<% @tweets.each do |t| %>
<% unless @tweet == t.todouhuken %>
<% else %>
<%= link_to t.name, tweet_path(t.id) %>
<% end %>
<% end %>
ruby on rails unlessで調べてみて!if文でも同じような書き方できるからやってみよう!
== 普通の=と同じように左右が同じって意味なのを思い出して!