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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

561閲覧

投稿ごとにルームを作り、投稿の名前をルームの名前にしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2022/09/29 07:07

編集2022/09/29 07:30

困っていること

投稿に応募機能を付け、応募ボタンを押すとDMできる機能を設置しました。
ですが、同じ投稿者で違う投稿に応募しても、同じ部屋(room)を使用することになってしまいます。
またルームの名前も、どの投稿に対して応募したかわかるように、応募した投稿の名前をルーム作成と同時に持ってきたいです。
1.ユーザーではなく投稿ごとに投稿者と応募者のルームを作りたい

2.投稿のタイトルをルームの名前に使われるようにしたい。

知りたいこと

1.plans_controllerのshow箇所の@userEntry=Entry.where(user_id: @plan.user.id)を変更させると投稿(plan)ごとにDMの部屋が作成できますでしょうか?

2.rooms_controllerのcreate箇所で投稿のデータを取得してルームテーブルにあるroom_nameカラムに入れるという流れでしょうか?

rooms_controller

class RoomsController < ApplicationController before_action :authenticate_user! def index end def create @room = Room.create @entry1 = Entry.create(room_id: @room.id, user_id: current_user.id) @entry2 = Entry.create(params.require(:entry).permit(:user_id, :room_id).merge(room_id: @room.id)) redirect_to "/rooms/#{@room.id}" end def show @room = Room.find(params[:id]) if Entry.where(user_id: current_user.id,room_id: @room.id).present? @messages = @room.messages @message = Message.new @entries = @room.entries else redirect_back(fallback_location: root_path) end end end

plans_controllerのルーム関連コード

def show @plan=Plan.find(params[:id]) @currentUserEntry=Entry.where(user_id: current_user.id) @userEntry=Entry.where(user_id: @plan.user.id) unless @plan.user.id == current_user.id @currentUserEntry.each do |cu| @userEntry.each do |u| if cu.room_id == u.room_id then @isRoom = true @roomId = cu.room_id end end end if @isRoom else @room = Room.new @entry = Entry.new end end end

room.rb

class Room < ApplicationRecord has_many :entries, dependent: :destroy has_many :messages, dependent: :destroy end

entry.rb

class Entry < ApplicationRecord belongs_to :user belongs_to :room end

情報が拙い可能性がありますので、また回答に必要なコードは追々、質問を修正させて提供させていただきます。
どうかよろしくおねがいいたします。

参考サイト
https://qiita.com/aaaasahi_17/items/9e7f344488c720aaf116
https://qiita.com/bindingpry/items/6790c91f374acc25bea2

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

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

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

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

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

y_waiwai

2022/09/29 07:12

ルームとは何でしょうか
退会済みユーザー

退会済みユーザー

2022/09/29 07:15

すみません。 ルームはroomテーブルでDM機能の部屋の部分を指しています。 説明足らずですみません。
winterboum

2022/09/29 22:54

応募ボタンを押すと どのコントローラーのどのアクションが呼ばれます?
退会済みユーザー

退会済みユーザー

2022/09/30 00:45

rooms_controllerのcreateアクションが呼ばれると思っています。
winterboum

2022/09/30 03:01

おもっている通りになってます?? 応募ボタンでどのviewのどの行ですか?
退会済みユーザー

退会済みユーザー

2022/09/30 05:29 編集

応募ボタンは下記の箇所に設置してあります。 views/plans/show 、、、 <% if user_signed_in? %> <% if current_user == @plan.user %> <div class='plan-content'> <h4><%= @plan.title %></h4> <h5><%= link_to @plan.user.name, user_path(@plan.user)%></h5> <p><%= @plan.start_on.strftime('%Y年%m月%d日') %>~<%= @plan.end_on.strftime('%Y年%m月%d日') %></p> <p><%= image_tag @plan.photo.url, :alt => '企画書イメージ図' if @plan.photo? %></p> <p><%= @plan.detail %></p> <div class= "address-content"> <h5>希望条件</h5> <p><%= @plan.conditions %></p> </div> <div class= "number-content"> <h5>電話番号</h5> <p><%= @plan.user.telephone_number %></p> </div> <div class= "address-content"> <h5>住所</h5> <p><%= @plan.user.address %></p> </div> <div class="plan-content-btn"> <%= link_to "削除", @plan, method: :delete, data: { confirm: "削除しますか?" } %> <%= link_to '戻る', '/' %> </div> </div> <% else %> <div class='plan-content'> <h4><%= @plan.title %></h4> <h5><%= link_to @plan.user.name, user_path(@plan.user)%></h5> <p><%= @plan.start_on.strftime('%Y年%m月%d日') %>~<%= @plan.end_on.strftime('%Y年%m月%d日') %></p> <p><%= image_tag @plan.photo.url, :alt => '企画書イメージ図' if @plan.photo? %></p> <p><%= @plan.detail %></p> <div class= "address-content"> <h5>希望条件</h5> <p><%= @plan.conditions %></p> </div> <div class= "number-content"> <h5>電話番号</h5> <p><%= @plan.user.telephone_number %></p> </div> <div class= "address-content"> <h5>住所</h5> <p><%= @plan.user.address %></p> </div> <div class="plan-content-btn"> <p><%= render 'favorites/favorite_button', plan: @plan %></p> この箇所↓ <div class="plan-content-btn"> <% unless @plan.user.id == current_user.id %> <% if @isRoom == true %> <p class="user-show-room"><a href="/rooms/<%= @roomId %>" class="btn btn-primary btn-lg">メッセージ</a> <% else %> <%= form_for @room do |f| %> <%= fields_for @entry do |e| %> <%= e.hidden_field :user_id, value: @plan.user.id %> <% end %> <%= f.submit "応募", class:"btn btn-primary btn-lg user-show-chat"%> <% end %> <% end %> <% end %> <%= link_to '戻る', '/', class:"btn btn-primary btn-lg " %> </div> </div> </div> <% end %> <% else %> <div class='plan-content'> <h4><%= @plan.title %></h4> <h5><%= link_to @plan.user.name, user_path(@plan.user)%></h5> <p><%= @plan.start_on.strftime('%Y年%m月%d日') %>~<%= @plan.end_on.strftime('%Y年%m月%d日') %></p> <p><%= image_tag @plan.photo.url, :alt => '企画書イメージ図' if @plan.photo? %></p> <p><%= @plan.detail %></p> <div class= "address-content"> <h5>希望条件</h5> <p><%= @plan.conditions %></p> </div> <div class= "number-content"> <h5>電話番号</h5> <p><%= @plan.user.telephone_number %></p> </div> <div class= "address-content"> <h5>住所</h5> <p><%= @plan.user.address %></p> </div> <div class="plan-content-btn"> <%= link_to '応募する', new_user_session_path , class:"btn btn-primary user-show-chat" %> <%= link_to '戻る', '/' %> </div> </div> <% end %> 、、、
guest

回答1

0

ベストアンサー

def create で @room = Room.create と全て nil な Roomを作っていますが、ここで 応募した投稿の名前を 入れるのが良いでしょう。
そのためには
<%= e.hidden_field :user_id, value: @plan.user.id %>
でなく
<%= e.hidden_field :plan_id, value: @plan.id %>
として plan.idを得て、plan名を手に入れましょう

投稿2022/09/30 09:58

winterboum

総合スコア23376

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

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

退会済みユーザー

退会済みユーザー

2022/09/30 11:54 編集

下記のやり方でplanのtitleをroomのroom_nameに入れようとしたのですが、代入できませんでした。 代入はparamsを使用しますか? また@entry2もplan.idから(掲載者)userの情報を代入することが可能でしょうか? def create room_plan_params = params.permit(:room_name) @room = Room.create(room_plan_params) @entry1 = Entry.create(room_id: @room.id, user_id: current_user.id) @entry2 = Entry.create(params.require(:entry).permit(:user_id, :room_id).merge(room_id: @room.id)) redirect_to "/rooms/#{@room.id}" end
winterboum

2022/09/30 13:11

params に :room_name なんてないでしょ?
退会済みユーザー

退会済みユーザー

2022/10/01 02:43 編集

room_plan_params = params.permit(:title)ですね。 そこからroom_nameに代入しなきゃいけないということですか? !追記 room_plan_params = params.permit(:title) @room = Room.create(params.permit(:room_name).merge(room_name: room_plan_params)) で試してみたのですが、うまく代入できませんでした。 room_plan_paramsではなくなく直接、merge(room_name: title))的な代入の仕方をしたほうが いいのでしょうか?
winterboum

2022/10/01 03:02

logs/development.log をみて、 Paramaters のところ貼ってください
退会済みユーザー

退会済みユーザー

2022/10/01 03:50

これです。 Started POST "/rooms" for 113.149.158.1 at 2022-10-01 02:50:30 +0000 Cannot render console from 113.149.158.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1 Processing by RoomsController#create as HTML Parameters: {"authenticity_token"=>"[FILTERED]", "entry"=>{"plan_id"=>"3"}, "commit"=>"応募"}iveRecord: 12.4ms | Allocations: 10700)
winterboum

2022/10/01 04:34

params[:entry][:plan_id] しかないではないですか params.permit(:title) も params.permit(:room_name) も値は nil。
退会済みユーザー

退会済みユーザー

2022/10/01 05:16

plan.titleをparamsに送り、room_nameに入れるにはどうすればいいでしょうか?
winterboum

2022/10/01 06:45

plan_id から plan を得ればできます。
退会済みユーザー

退会済みユーザー

2022/10/01 09:49

@plan = Plan.find(params[:id])でplanを得ました。 ここからroom_nameに代入するには インスタンス変数 = モデル名.find_by(カラム名: params[:パラメータ名]) の記述で代入できますか?
退会済みユーザー

退会済みユーザー

2022/10/01 10:56

すみません。 調べてやってみたのですが、間違っていたようです。 planを得るにはどうすればいいのでしょうか?
winterboum

2022/10/01 11:01 編集

@plan = Plan.find(params[:entry][:id])で 良いですよ
退会済みユーザー

退会済みユーザー

2022/10/01 16:35 編集

@plan = Plan.find(params[:entry][:plan_id]) @room = Room.create(params.require(:room).permit(:room_name)) ここからroom_nameにplan.titleを代入するにはどうすればいいでしょうか? mergeメソッドは代入をする際に使用しますか?
winterboum

2022/10/01 21:19

@room = Room.create(params.require(:room).permit(:room_name)) が意味ないです。params.require(:room).permit(:room_name) が空ですから @room = Room.create(room_name: @plan.name)
退会済みユーザー

退会済みユーザー

2022/10/02 09:08 編集

ありがとうございます! #<Room id: 10, room_name: "テスト", created_at: "2022-10-02 10:44:41.229037000 +0900", updated_at: "2022-10-02 10:44:41.229037000 +0900">]> 受け渡しできたようです。 また、ユーザーごとにDMを作成すると、違う掲載で同じ投稿者という状況でも同じroomを使用してしまう状況で、どの掲載に応募しているのかわからなくなるので、planごとにroomを作成したいのですが、この時にrooms_controolerの同じくcreate箇所の@entry2(掲載者)にplan情報を受け渡す必要がありますか? また現状はDMには@entry1(応募者)しか、roomに収容されていない為、planからuser_idを受け渡せば、掲載者も再びroomに入れることはできますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問