Rails ActionCableを用いたとき、ログインしているユーザーの値が取得できない。
Q&A
Closed
現在、エンジニアを目指し、独学で学習を進めています。
初めて質問を利用させていただきます。
今回の質問はポートフォリオ作成の過程で出てきた疑問で解決できず困っています。
皆様の知識とお力をお貸しください。
内容としては下記のとおりです。
Railsを使ってWebアプリの作成を行っており、フロントエンド側の処理はJavesciptを使用しています。
制作するアプリは、学習時間をタイマーで測り、学習時間を集計、トータルの学習時間を確認できるようするためのものです。
制作するにはJavesciptとデータベースで相互にデータのやり取りが必要であったため、RailsのActionCableの機能を利用して行うことにしました。
なんとか、Javesciptで処理した値をデータベースに保存することはできましたが、ログインしているユーザーのIDも一緒に保存しようとすると、保存できませんでした。
データベースの構成は下記のとおりです。
①下記のように記載すると、User_idは空白になるものの、データベースに保存はできる状態です。
def listset(data)
@list = List.new(list_id: data["list_id"], list_content: data["list_content"])
@list.save
ActionCable.server.broadcast "timer_channel", data["list_id", "list_content"]
end
②下記のように記載すると、@current_userのIDが取得できずデータベースに保存されませんでした。
def listset(data)
@list = List.new(user_id: @current_user.id, list_id: data["list_id"], list_content: data["list_content"])
@list.save
ActionCable.server.broadcast "timer_channel", data["list_id", "list_content"]
end
Aplication_controller.rbでは下記のようにログイン情報を保持していました。
class ApplicationController < ActionController::Base
before_action :set_current_user
def set_current_user
@current_user = User.find_by(id: session[:user_id])
end
end
解決策を探るため、調べてみると、下記のサイトに『WebSocketサーバからはセッションが利用できないが、Cookieにはアクセスが可能』記載されていたため、代わりにCookieの値を保存して、利用してみることにしました。
参考サイト:https://railsguides.jp/action_cable_overview.html
Cookieの保存はログイン時に行うため、User_controller.rbに定義し、それをChannelで利用できるか試すことにしました。
下記のように定義しています。
def login
@user = User.find_by(email: params[:email], password: params[:password])
if @user
session[:user_id] = @user.id
cookies.encrypted[:user_id] = @user.id
flash[:notice] = "ログインしました"
redirect_to("/users/timer")
else
@email = params[:email]
@password = params[:password]
@error_message = "Emailまたは、Passwordが正しくありません"
render("users/login_form")
end
end
def listset(data)
@list = List.new(user_id: cookies.encrypted[:user_id], list_id: data["list_id"], list_content: data["list_content"])
@list.save
ActionCable.server.broadcast "timer_channel", data["list_id", "list_content"]
end
しかし、依然と同様に値が取得できていないようで、データベースにUser_idをデータベースに保存することができませんでした。
Application.jsの turbolinks require_tree を切っていたりするのでそこに原因なのかもしれないと思いつつも、もうお手上げ状態です。
、お力添えいただけますと幸いです。