こんばんは。
自分の目標等を投稿できるオリジナルアプリを作っています。
実装したい内容について
- 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
どうか教えていただけますと幸いです。
よろしくお願いします。
実装あんまり見てないですけど、データ取得時にそもそもuser_idで絞ればいいのでは?
コメントありがとうございました!!
解決できました!!
回答1件
あなたの回答
tips
プレビュー