1
0

More than 1 year has passed since last update.

【超簡単】Rails 公開・非公開投稿 実装方法

Posted at

はじめに

Twitterライクのようなアプリを作成してみたが、投稿を公開・非公開できるようにしたい・・・!という人に向けて執筆します!

完成形

下記の写真のように、公開非公開ボタンを作成し、公開を押して投稿すると全員にその投稿が表示され、非公開を押して投稿すると全体には表示されないが、マイページに自分だけが見れる投稿が作成される仕組みを作ります!

image.png

公開か非公開かを判定するためのカラムを追加しよう!

rails g migration AddreleaseToテーブル名 release:integer
rails db:migrate

該当するコントローラーの最後の方の行にparams〜とあると思います!
そこに,:releaseをつけたそう!

コントローラー
    params.require(:tweet).permit(:body,:title, :image,:release)

新規投稿ページ

以下のコードを<%= form_for 〜 do |f| %> 〜 <% end %>の間に挿入します!

new.html.erb
 <div class="form-check form-check-inline">
   <%= f.radio_button :release, '1' ,class:"form-check-input mb-3" %>
   <%= f.label :release, '公開', value: 1 %>
 </div>
 <div class="form-check form-check-inline">
   <%= f.radio_button :release, '0',class:"form-check-input mb-4" %>
   <%= f.label :release, '非公開', value: 0 %>
 </div>

一覧ページのコントローラー

tweets_controller.rb
def index
 @tweets = Tweet.where(release:1).order(id: "DESC")
end

このwhere分が今回の鍵です!
where(カラム名:値)とすることで、特定のレコードを取得することができます!
今回はreleaseカラムの値が1、つまり公開する投稿のレコードを取得しています!

一覧ページのview

index.html.erb
<% @tweets.each do |t| %>
    <%= t.title %>
    <%= t.body %>
<% end %>

マイページのコントローラー

users_controller.rb
def show
    @user = User.find(params[:id])
end

マイページのビュー

show.html.erb
<%if current_user.id == @user.id %>
    <% @user.tweets.each do |t| %>
        <%= t.title %>
        <%= t.body %>
    <% end %>
<% else %>
    <% @user.tweets.where(release:1).each do |t| %>
        <%= t.title %>
        <%= t.body %>
     <% end %>
<% end %>

if文にて条件分岐しています!
もしログインしているユーザーがマイページのユーザーと一致していれば、自分の投稿を全部表示
そのほか(ログインしているユーザーとマイページのユーザーが違っているとき)の場合、そのページのユーザーの公開の投稿のみ表示
というわけです!

最後に

いかがでしたでしょうか?
ほかにももっといい書き方があると思うので、コメントなどで教えていただけるとありがたいです!
ここまで読んでいただきありがとうございました!
少しでも力添えできていたなら幸いです!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0