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

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

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

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

3611閲覧

railsでユーザー同士のメッセージ機能を付けたい

yoshimitsu41

総合スコア36

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2017/04/24 07:30

編集2017/04/25 05:23

タイトル通りですがrailsでユーザー同士のメッセージ機能の実装に関してです。
モデルは

  • userモデル
  • roomモデル
  • messageモデル

の3つで対応しようと考えています。

###userモデルのカラム

  • id
  • email
  • password
  • nickname

user.rb

ruby

1class User < ActiveRecord::Base 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :trackable, :validatable 6 has_one :profile 7 has_many :messages 8 acts_as_followable # フォロワー機能 9 acts_as_follower # フォロー機能 10end

###roomモデルのカラム

  • id
  • user_id
  • second_user_id

のカラムがあります。
user_idが送信した人で
second_user_idが受信した人
にしようと思っています。

room.rb

ruby

1class Room < ActiveRecord::Base 2 belongs_to :user 3 belongs_to :second_user, class_name: 'User' 4 has_many :messages 5end

###messageモデルのカラム

  • id
  • text
  • room_id
  • user_id

があります。

message.rb

ruby

1class Message < ActiveRecord::Base 2 belongs_to :room 3 belongs_to :user 4end

####user/show.html.erb

ruby

1 <h3>メッセージを送る</h3> 2 <%= form_tag('/messages', method: :post,) do %> 3 <div class="form-group"> 4 <textarea class="form-control" rows="5" name="text"></textarea> 5 </div> 6 <button type="submit" class="btn btn-primary btn-lg btn-block">送信</button> 7 <% end %>

submitをクリックすると・・・
roomが新しく作成されて送信者のIDと受信者のIDがroomsテーブルに追加されるようにしたい。
messagesテーブルにtextとroom_idとuser_idが追加されるようにしたい。

####controller/messages_controller.rb

ruby

1 def create 2 #以下はルームモデルに追加する 3 @user = User.find(params[:id]) 4 binding.pry 5 room = Room.new(user_id: current_user.id,second_user_id: user.id ) 6 room.save 7 #以下はメッセージモデルに追加する 8 Message.create(text: message_params[:text],user_id: current_user.id,room_id: room.id) 9 redirect_to user_path(current_user.id) 10 end 11 12 private 13 def message_params 14 params.permit(:text) 15 end 16

####routes.rb

ruby

1 Rails.application.routes.draw do 2 #devise_for :users 3 devise_for :users do 4 member do 5 get :follow 6 get :unfollow 7 end 8 end 9 root 'homes#index' #root_path 10 get 'flow' => 'flows#index' 11 resources :messages 12 resources :profiles 13 resources :rooms 14 resources :users do 15 member do 16 put :follow 17 put :unfollow 18 end 19 end 20 end

上記の内容で登録[submit]すると下記のようなエラーが出ます。
イメージ説明

受信した側のID(second_user_id)が取得できていないのですが
どのようにして取得すればよろしいでしょうか?

ご指摘・ご教授お願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ruby

1 <h3>メッセージを送る</h3> 2 <%= form_tag('/messages', method: :post,) do %> 3 <div class="form-group"> 4 <textarea class="form-control" rows="5" name="text"></textarea> 5<input id="user_id" name="user_id" type="hidden" value="<%=@user.id%>"><input> 6 7 </div> 8 <button type="submit" class="btn btn-primary btn-lg btn-block">送信</button> 9 <% end %>

controller

ruby

1def create 2 #以下はルームモデルに追加する 3 @user = User.find(params[:user_id]) 4 binding.pry 5 room = Room.new(user_id: current_user.id,second_user_id: user.id ) 6 room.save 7 #以下はメッセージモデルに追加する 8 Message.create(text: message_params[:text],user_id: current_user.id,room_id: room.id) 9 redirect_to user_path(current_user.id) 10 end 11 def message_params 12 params.permit(:user_id,:text) 13 end

で動くと思いますが

どうでしょう

ちなみに
roomモデルがあることから
チャットのようなものを作りたいのかなと
思いますが、Railsの普通の機能でチャットを作ると
実際に運用すると、すごく重くて使い物にならないと思いますよ
ActionCableとRedisを使って実装してください

rails5でやるときは
rails5
で結構簡単にできますが
rails4だと結構大変です。
rails4
上記サイトをみても最初からつまづくと思うので
一応ヒントとして

ruby

1#Gemfile 2gem 'actioncable', github: 'rails/actioncable',branch: 'archive'

としてみてください

投稿2017/04/25 00:41

編集2017/04/25 07:14
moke

総合スコア2241

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

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

yoshimitsu41

2017/04/25 05:54 編集

動かなかったです...。 同じエラーが出るのですが messege_controller.rbのcreateアクションの @user = User.find(params[:id]) でうまく情報を引っ張れていなように思うのですが何故引っ張れないのかがわからない状態です
moke

2017/04/25 06:09

修正しました、二つ目の回答に誘導しようと思い、 一つ目の回答が適当でした。
yoshimitsu41

2017/04/25 06:45

やはりエラーです。。。 エラーで赤く光ってるのは @user = User.find(params[:user_id]) の部分。 エラー画面のParametersを見ると {"utf8"=>"✓", "authenticity_token"=>"BufkFsRo+74QwyE8R7av3boAwatddrpJcH3b7gBxdEvJKCmFJDS1KvGW+J8YDit3jfhpCtTEBEpwb1ZrzZ7nhA==", "text"=>"テスト送信", "user_id"=>""} となっておりuser_idに渡っていない状態です。。。
moke

2017/04/25 06:57

なんどももすみません 元のコードがrailsに則っていないので、ついミスが出てしまって
yoshimitsu41

2017/04/25 06:58

ありがとうございます! <input id="user_id" name="user_id" type="hidden" value="<%= @user.id %>" /> とすることで思い通りの動きになりました! いつもありがとうございます!
moke

2017/04/25 07:15

今度からは、動くからいいやではなくRailsのルールに従って書いてくださいね そうすると、質問者、回答者共に楽だと思いますよ。
yoshimitsu41

2017/04/25 07:31

了解しました!railsのルールに従えるようにrailsの知識を深めていきます! 本当に有難うございます!
yoshimitsu41

2017/04/25 12:00 編集

何度もすみません。。。 routes.rbを resources :users do resources :rooms do resources :messages end member do put :follow put :unfollow end end のように変更してネストさせると <%= form_tag('/messages/', method: :post,) do %> <div class="form-group"> <textarea class="form-control" rows="5" name="text"></textarea> <input id="user_id" name="user_id" type="hidden" value="<%= @user.id %>" /> </div> <button type="submit" class="btn btn-primary btn-lg btn-block">送信</button> <% end %> のsubmitをクリックするとルーティングエラーがでます。 rake routesが user_room_messages GET /users/:user_id/rooms/:room_id/messages(.:format) messages#index POST /users/:user_id/rooms/:room_id/messages(.:format) messages#create new_user_room_message GET /users/:user_id/rooms/:room_id/messages/new(.:format) messages#new edit_user_room_message GET /users/:user_id/rooms/:room_id/messages/:id/edit(.:format) messages#edit user_room_message GET /users/:user_id/rooms/:room_id/messages/:id(.:format) messages#show PATCH /users/:user_id/rooms/:room_id/messages/:id(.:format) messages#update PUT /users/:user_id/rooms/:room_id/messages/:id(.:format) messages#update DELETE /users/:user_id/rooms/:room_id/messages/:id(.:format) messages#destroy です。 submitしたらroomが新しく作成されるようにしたいのですが <%= form_tag('/messages', method: :post,) do %> はどのように記述すれば改善されますでしょうか?
moke

2017/04/25 13:46 編集

なぜ、そのようにネストしたいのですか?そうするとメッセージを見るのに、いちいちユーザーとルームを指定しないといけません。ユーザーのメッセージ一覧を見たかったり、ルームごとに見たり出来ませんが…。もう一度どうしたいかを紙に書くなどして整理して新たに質問をし直してはいかがでしょう?
yoshimitsu41

2017/04/27 07:31

おっしゃるとおりでした。。。ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問