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

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

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

Ruby on Rails

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

Q&A

解決済

1回答

1352閲覧

カレンダーを共有できるようにしたい

gomappi

総合スコア8

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/03/28 07:28

前提・実現したいこと

カレンダーを共有できるアプリケーションを作成しています。
そこで、あるユーザーのカレンダーを違うユーザーに共有できるように実装しているのですが、うまく保存できません。
ご教授いただけると助かります。

実装しようとしていること

ログイン中のユーザーが他のユーザーを検索し(emailで検索)、見つかったらログイン中のユーザーのカレンダーを全て表示する。
その後、共有したいカレンダーをクリックし、共有モデル(share_calendarモデル)に保存したいがインスタンス@share_calendarが全てnilとなってしまい、保存ができない。

該当のソースコード

views/share_calendar.html.erb(ユーザーを検索)

<h1>カレンダーを共有</h1> <%= current_user.nickname + "さんのカレンダーを共有" %><br> 共有したいユーザーのメールアドレスを入力してください。 <%= form_with url: share_user_calendars_path , method: :get, local: true do |f| %> <%= f.text_field :email ,placeholder: "ユーザーを検索"%> <%= f.submit :検索 %> <% end %> <% if params[:email].present? %> <%= params[:email] + "の検索結果" %><br> <% unless @user.present? %> <%= "ユーザーが見つかりませんでした" %> <% end %> <% end %> <% @user.each do |user| %> <% if current_user.email == user.email %> <%= "現在のユーザーです" %> <% else %> <%= link_to "#{user.nickname}" + "さんとカレンダーを共有する" , share_calendar_calendar_path(user.id) %> <% end %> <% end %>

views/share_calendar.html.erb

<h1><%= "#{@user.nickname}" + "さんとシェアするカレンダーを選択" %></h1> <% @calendars.each do |calendar| %> <% next unless current_user.id == calendar.user_id %> <%= link_to "#{calendar.calendar_name}のカレンダーを共有", share_calendar_create_calendar_path(calendar.id),method: :post %><br> <% end %>

views/share_calendar_create.html.erb

<h1>カレンダーの共有が完了しました</h1> <%= link_to "トップページに戻る", root_path %>

controller/calendars_controller.rb

class CalendarsController < ApplicationController before_action :authenticate_user!, only: [:new, :create, :show, :destroy] def index @calendars = Calendar.all end def new @calendar = Calendar.new end def create @calendar = Calendar.new(calendar_params) if @calendar.save redirect_to root_path else render :new end end def show @calendar = Calendar.find(params[:id]) @schedules = Schedule.all redirect_to root_path unless @calendar.user_id == current_user.id end def destroy @calendar = Calendar.destroy(params[:id]) end def share_user if params[:email].present? @user = User.where(email: "#{params[:email]}") else @user = User.none end end def share_calendar @user = User.find(params[:id]) @calendars = Calendar.all end def share_calendar_create @calendar = Calendar.find(params[:id]) @user = User.find(params[:id]) @share_calendar = ShareCalendar.new(share_calendar_params) if @share_calendar.save else redirect_to root_path end end private def calendar_params params.require(:calendar).permit(:calendar_name).merge(user_id: current_user.id) end def share_calendar_params params.permit(user_id: @user_id,calendar_id: @calendar_id) end end

model/share_calendar.rb

class ShareCalendar < ApplicationRecord belongs_to :user belongs_to :calendar with_options presence: true do validates :user_id validates :calendar_id end end

試したこと

binding.pryを使ってcalendarコントローラーのshare_calendar_createのデバッグを行いましたが、最初に記述した通り、@share_calendarが全てnilとなってしまいます。@userと@calendarにはちゃんとデータが入っているのは確認できました。

値が保存できていないので、calendarコントローラーのshare_calendar_createのアクションでelseとなりroot_pathへと飛ばされてしまいます。

推測

paramsに値がうまく入っていないことが問題だと考えています。
今回は今までと違い、formメソッドを使用してデータを登録していないので、もしformメソッドを使ってログイン中のユーザーのカレンダーだけを選択できる方法があればご教授いただきたいです。

補足情報(FW/ツールのバージョンなど)

Rails 6.0.3.5
ruby 2.6.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

ShareCalendarの作成に必要な情報はカレンダーとログインしているユーザーのidです。

カレンダーのidはparams[:id]から取得できます。
ログインしているユーザーはcurrent_userから取得できます。

ruby

1def share_calendar_create 2 @share_calendar = ShareCalendar.new(calendar_id: params[:id], user: current_user) 3 if @share_calendar.save 4 ...

ShareCalendar で belongs_to :user としているので、user: current_userと指定すれば大丈夫です。
user_id: current_user.id でも良いです。

before_action :authenticate_user! の設定も忘れないでください。

投稿2021/03/28 09:56

neko_daisuki

総合スコア2090

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

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

gomappi

2021/03/28 11:15

neko_daisukiさん、ご連絡ありがとうございます! おっしゃられた通りに入力しましたら無事保存できました ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問