質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby on Rails

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

Q&A

解決済

1回答

1208閲覧

rails パラメータが渡ってくれない

mothi5656

総合スコア27

Ruby on Rails

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

0グッド

0クリップ

投稿2021/11/05 15:05

編集2021/11/08 21:57

前提・実現したいこと

写真のようなモデルの構成で、グループごとのカレンダーを作成して、チャットもできるようなアプリを作っています。現在グループごとではなく全てのユーザーが同じカレンダーを使う構成になっているので、グループごとに違いカレンダーを使える機能を実装したいと考えています。
イメージ説明

グループを作成するのはできたのですが、そのグループのidをもとに各グループのカレンダーを表示する方法がわかりません。

コントローラ

class GroupsController < ApplicationController before_action :authenticate_user! def index @groups = Group.all.order(updated_at: :desc) end def show @group = Group.find_by(id: params[:id]) if !@group.users.include?(current_user) @group.users << current_user flash[:notice] = "グループに加入しました" render groups_path end end def new @group = Group.new @group.users << current_user end def create if Group.create(group_params) redirect_to groups_path, notice: 'グループを作成しました' else render :new end end private def group_params params.require(:group).permit(:name) end end
class CalendarsController < ApplicationController before_action :authenticate_user! def index #@calendars = Calendar.find_by(group_id: params[:id]) @calendars = Calendar.all end def new @calendar = Calendar.new end def show @calendar = Calendar.find(params[:id]) end def create Calendar.create(calendar_params) redirect_to calendars_path end def destroy @calendar = Calendar.find(params[:id]) @calendar.destroy redirect_to calendars_path, notice:"削除しました" end def edit @calendar = Calendar.find(params[:id]) end def update @calendar = Calendar.find(params[:id]) if @calendar.update(calendar_params) redirect_to calendars_path, notice: "編集しました" else render 'edit' end end private def calendar_params params.require(:calendar).permit(:title, :content, :start_time) end end

###calendars/index.html.erb

<h1>#</h1> <table> <thead> <tr> <th>タイトル</th> <th>時間</th> <th colspan="3"></th> </tr> </thead> <tbody> <% @calendars.each do |calendar| %> <tr> <td><%= calendar.title %></td> <td><%= calendar.start_time.strftime("%Y-%m-%d %H:%M") %></td> <td><%= link_to 'Show', calendar_path %></td> <td><%= link_to 'Edit', edit_calendar_path(calendar.id) %></td> <td><%= link_to 'Destroy',calendar_path(calendar.id), method: :delete, data: { confirm: 'Are you sure?' } %></td> </tr> <% end %> </tbody> </table> <br> <%= link_to 'イベント追加', new_calendar_path(group_id: @group_id) %> <%= month_calendar events: @calendars do |date, calendars| %> <%= date.day %> <% calendars.each do |calendar| %> <div> <%= link_to calendar.title, calendar_path %> </div> <% end %> <% end %>

###calendars/new.html.erb

<%= form_with(model: @calendar, local: true) do |form| %> <div class="title"> <%= form.label :title %> <%= form.text_field :title %> </div> <div class="time"> <%= form.label :start_time %> <%= form.datetime_select :start_time %> </div> <div class="content"> <%= form.label :content %> <%= form.text_field :content %> </div> <div class="submit"> <%= form.submit %> </div> <% end %>

###groups

<div><%=link_to "グループを作成する",new_group_path %></div> <div><p>グループ一覧</p></div> <% @groups.each do |group| %> <%= link_to group.name, calendars_path(group_id: group) %> <%= group.users.count %> <% end %>

###routes.rb

Rails.application.routes.draw do root 'top_page#index' devise_for :users resources :groups, only: [:index, :show, :new, :create] do resources :calendars, only: [:index, :new, :create] end resources :calendars, only: [:show, :edit, :update, :destroy] do resources :calendar_messages, only: [:index, :create, :destroy] end # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html end

試したこと

以下のようにクエリで値を渡してみましたが、おそらくgroup_idがnilであったため、dbに保存できませんでした。また、一度calendarに保存するとクエリの情報が消えてしまうのでこの方法では実装できないと思い、やめました。

<% @groups.each do |group| %> <%= link_to group.name, calendars_path(group_id: group) %> <%= group.users.count %> <% end %>``` ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

winterboum

2021/11/07 22:49

図を見るとUserとGroupは多対多にみえます。 Userは複数のGroupに属することになりますが、 そうするとどのGroupのCarendarを表示するのですか?
guest

回答1

0

ベストアンサー

Calendarの作成時にgroup_idが渡って居ないのが問題です。
model Calendar に has_one :group はありますか?
もしあれば(かつ余分なoptionがなければ)group_id なしではsaveできないはずなので、??? です。

Calendarのnew.htmlでgroupを選ばせるか
Groupのshowあたりで Calendar作成 ボタンから作成させるときにそのgroupをわたして設定するか
してください

投稿2021/11/07 22:58

winterboum

総合スコア23366

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

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

mothi5656

2021/11/08 01:53

belongs_toなら書いてあるのですがhas_oneではないといけないのでしょうか。
winterboum

2021/11/08 13:25

それでもよいです。 それのが良いかな
winterboum

2021/11/08 13:26

で、 それでCalenderがsaveできました?
mothi5656

2021/11/08 21:56

今までは、```<%= link_to group.name, calendars_path(group_id: group) %>```でパラメータを渡そうとしていましたが、新しくcalendarに予定を追加したりしてredirectされるとクエリで渡されたgroup_idが消えてしまいました。なので、routes.rbを変えて浅いネストにしました。そうするとcalendar追加時点でURLからパラメータを持ってきてgroup_idを含めたその他の情報もdbに保存ができました。
winterboum

2021/11/08 22:23

bon! すると残る問題は?
mothi5656

2021/11/09 00:39

あとは質問の内容からは外れますが、特定のユーザにグループ招待をする機能くらいです。
winterboum

2021/11/09 00:49

ということは「そのグループのidをもとに各グループのカレンダーを表示する」のはできた?
winterboum

2021/11/09 01:52

ではこの質問は終了ということ出
mothi5656

2021/11/09 01:55

わかりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問