🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails 6

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

Q&A

解決済

1回答

1555閲覧

全てのページを「マイページ」のような自分が投稿した内容だけの一覧表示にしたい。

cherry2020

総合スコア10

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/01/22 13:13

こんばんは。

自分の目標等を投稿できるオリジナルアプリを作っています。

実装したい内容について

  • indexページについて、いろんなユーザーが投稿した内容が全て表示されるのではなく、カレントユーザーが投稿した内容を、カレントユーザーのみに表示されるようにしたいです。
  • 目標設定に限らず、今後作成するページ全てについて他の人が見られないようにしたいです。

現在の状況について

  • 現在deviseによるuserモデルと、目標を立てるためのobjectiveモデルを別々に作成し、アソシエーションを組んでいる状況です。

  • 下記のように実装して、エラーは消えたのですが、肝心のindexページにカレントユーザーが投稿した内容が反映されない状況です。(DBには保存できています)

  • これはもしかしてルーティングにおいてuserに全て入れ子にすることが必要なのでしょうか?

(実装したい内容としては、ユーザー情報を消せば、それに紐づく目標なども全て消えたりする状況にしたいです)

  • 今まで、ユーザー登録した人が投稿してみんなが見れるようなアプリは作成してきたのですが、ユーザー登録した人がそれぞれのマイページで投稿した目標を作成・一覧できるような実装方法が調べても分からず教えて欲しいです。

ruby

1# app/views/objectives/index.html.erbの状況 2 3<div class="contents row"> 4<%= link_to '投稿する', new_objective_path, class: "login" %> 5<% if current_user.id == @objective.user_id %> 6 <% @objectives.each do |objective| %> 7 <div class="content_post" style="background-image: url(<%= asset_path('note.png') %>);"%> 8 <div class="more"> 9 <span><%= image_tag 'menu.png' %></span> 10 <ul class="more_list"> 11 <li> 12 <%= link_to '詳細', objective_path(objective.id), method: :get %> 13 </li> 14 <li> 15 <%= link_to '編集', edit_objective_path(objective.id), method: :get %> 16 </li> 17 <li> 18 <%= link_to '削除', objective_path(objective.id), method: :delete %> 19 </li> 20 </ul> 21 </div> 22 <p><%= objective.title %></p> 23 <p><%= objective.category_id %></p> 24 <span class="name"> 25 <%= objective.created_at %> 26 </span> 27 </div> 28 <% end %> 29 <% end %> 30</div>

ruby

1# app/controllers/objectives_controller.rbの状況 2 3class ObjectivesController < ApplicationController 4 before_action :authenticate_user! 5 before_action :set_objective, only: [:edit, :show] 6 7 def index 8 @objectives = Objective.includes(:user).order('created_at DESC') 9 @objective = Objective.new 10 end 11 12 def new 13 @objective = Objective.new 14 end 15 16 def create 17 @objective = Objective.new(objective_params) 18 if @objective.save 19 redirect_to objectives_path 20 else 21 render :new 22 end 23 end 24 25 def destroy 26 objective = Objective.find(params[:id]) 27 objective.destroy 28 end 29 30 def edit 31 end 32 33 def update 34 objective = Objective.find(params[:id]) 35 objective.update(objective_params) 36 end 37 38 def show 39 end 40 41 private 42 43 def objective_params 44 params.require(:objective).permit(:title, :category_id, :wish, :outcome, :obstacle, :plan).merge(user_id: current_user.id) 45 end 46 47 def set_objective 48 @objective = Objective.find(params[:id]) 49 end 50end

ruby

1# config/routes.rbの状況 2Rails.application.routes.draw do 3 devise_for :users 4 root to: 'homes#index' 5 get 'homes/index' 6 resources :objectives 7 resources :troubles 8 resources :users 9end 10

ruby

1# app/models/objective.rbの状況 2 3class Objective < ApplicationRecord 4 extend ActiveHash::Associations::ActiveRecordExtensions 5 belongs_to :user 6 belongs_to_active_hash :category 7 8 with_options presence: true do 9 validates :title 10 validates :category_id 11 validates :wish 12 validates :outcome 13 validates :obstacle 14 validates :plan 15 end 16end 17

ruby

1# app/models/user.rbの状況 2 3class User < ApplicationRecord 4 # Include default devise modules. Others available are: 5 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 6 devise :database_authenticatable, :registerable, 7 :recoverable, :rememberable, :validatable 8 9 has_many :objectives 10 11 with_options presence: true do 12 validates :nickname, uniqueness: true, length: { maximum: 15 } 13 validates :birthdate 14 # @含むこと・存在することはdeviseのデフォルト実装のため省略 15 validates :email, uniqueness: true 16 # 存在すること・確認用を含めて2回入力はデフォルト実装のため省略 安全性を高めるために15文字以上に設定 17 validates :password, length: { minimum: 15 } 18 # パスワードが半角英数字(空文字NG)以外の場合には、メッセージを出す 19 PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze 20 validates_format_of :password, with: PASSWORD_REGEX, message: 'Include both letters and numbers' 21 end 22end 23

どうか教えていただけますと幸いです。
よろしくお願いします。

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

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

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

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

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

m.ts10806

2021/01/22 22:37 編集

実装あんまり見てないですけど、データ取得時にそもそもuser_idで絞ればいいのでは?
cherry2020

2021/01/23 01:03

コメントありがとうございました!! 解決できました!!
guest

回答1

0

自己解決

コントローラーのindexアクションを以下のように変更したらできました。

m.ts10806さん、初めてコメントいただき嬉しかったです、ありがとうございました。

ruby

1class ObjectivesController < ApplicationController 2 before_action :authenticate_user! 3 before_action :set_objective, only: [:edit, :show] 4 5 def index 6 @objectives = current_user.objectives.all.order(created_at: :desc) 7 end 8 9 def new 10 @objective = Objective.new 11 end 12 13 def create 14 @objective = Objective.new(objective_params) 15 if @objective.save 16 redirect_to objectives_path 17 else 18 render :new 19 end 20 end 21 22 def destroy 23 objective = Objective.find(params[:id]) 24 objective.destroy 25 end 26 27 def edit 28 end 29 30 def update 31 objective = Objective.find(params[:id]) 32 objective.update(objective_params) 33 end 34 35 def show 36 end 37 38 private 39 40 def objective_params 41 params.require(:objective).permit(:title, :category_id, :wish, :outcome, :obstacle, :plan).merge(user_id: current_user.id) 42 end 43 44 def set_objective 45 @objective = Objective.find(params[:id]) 46 end 47end 48

投稿2021/01/23 01:08

cherry2020

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問