メッセージ送信時に生じるエラーの解決
プログラミング初心者で、Ruby on Rilsとjavascriptを使用し、オリジナルアプリを作ろうとしています。
現在は、ActionCableを用いた非同期通信のチャットアプリを製作しているところです。
メッセージを送信すると、エラーが出てしまいます。
ご指導いただきたいです。
よろしくお願いします。
undefined method `to_key' for〜エラーの解決
エラー文↓↓↓
NoMethodError (undefined method `to_key' for 1:Integer
Did you mean? to_query):
app/controllers/application_controller.rb:13:in block in render_with_signed_in_user' app/controllers/application_controller.rb:13:in
tap'
app/controllers/application_controller.rb:13:in render_with_signed_in_user' app/models/message.rb:21:in
template'
app/controllers/messages_controller.rb:12:in `create'
該当のソースコード
messagescontroller
model
1class Message < ApplicationRecord 2 belongs_to :room 3 belongs_to :user 4 has_one_attached :image 5 extend ActiveHash::Associations::ActiveRecordExtensions 6 belongs_to :heat 7 belongs_to :condition 8 9 with_options presence: true do 10 validates :heat_id 11 validates :condition_id 12 validates :content 13 end 14 15 with_options numericality: { other_than: 1, message: 'Select' } do 16 validates :heat_id 17 validates :condition_id 18 end 19 20 def template 21 ApplicationController.render_with_signed_in_user(user_id, partial: 'messages/message', locals: { message: self }) 22 end 23end
applicationcontroller
1class ApplicationController < ActionController::Base 2 before_action :configure_permitted_parameters, if: :devise_controller? 3 4 private 5 6 def configure_permitted_parameters 7 devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) 8 devise_parameter_sanitizer.permit(:account_update, keys: [:name]) 9 end 10 11 def self.render_with_signed_in_user(user, *args) 12 ActionController::Renderer::RACK_KEY_TRANSLATION['warden'] ||= 'warden' 13 proxy = Warden::Proxy.new({}, Warden::Manager.new({})).tap{|i| i.set_user(user, scope: :user) } 14 renderer = self.renderer.new('warden' => proxy) 15 renderer.render(*args) 16 end 17end
js
1import consumer from "./consumer" 2 3 4 consumer.subscriptions.create("RoomChannel", { 5 connected() { 6 // Called when the subscription is ready for use on the server 7 }, 8 9 disconnected() { 10 // Called when the subscription has been terminated by the server 11 }, 12 13 received(data) { 14 document.getElementById('upper-message'). 15 insertAdjacentHTML('beforeend',data['message']) 16 } 17 }); 18
rb
1class RoomChannel < ApplicationCable::Channel 2 def subscribed 3 stream_from "room_channel" 4 end 5 6 def unsubscribed 7 # Any cleanup needed when channel is unsubscribed 8 end 9 10end
mainhtml
1<div class="chat-header"> 2 <div class="left-header"> 3 <div class="header-title"> 4 *<%= @room.room_name %>さんの連絡ルーム* 5 </div> 6 </div> 7 <div class="right-header"> 8 <div class="header-button"> 9 <a class="btn btn-danger" href="#">ルームを終了する</a> 10 </div> 11 </div> 12</div> 13 14<div id="messages"> 15 <%= render partial: 'message', collection: @messages %> 16</div> 17 18<%= form_with model: [@room, @message], class: 'form-box', id: "form-box" do |f| %> 19 <div class="form-input"> 20 <%= f.collection_select(:heat_id, Heat.all, :id, :name, {}, {class:"form-control", id:"select_box"}) %> 21 <%= f.collection_select(:condition_id, Condition.all, :id, :name, {}, {class:"form-control", id:"select_box"}) %> 22 <%= f.text_area :content, class: "form-control", placeholder:"メッセージを入力", id:"message_content", rows:"3" %> 23 <label class="form-image"> 24 <span class="btn btn-outline-dark">画像</span> 25 <%= f.file_field :image, class: "hidden" %> 26 </label> 27 </div> 28 <%= f.submit '送信', class:"btn btn-info", id:"submit" %> 29 30<% end %>
messagehtml
routes
1Rails.application.routes.draw do 2 mount ActionCable.server => '/cable' 3 get 'rooms/index' 4 devise_for :users 5 root to: "activities#index" 6 resources :users, only: [:edit, :update] 7 resources :activities, only: [:index, :new, :create, :show] 8 9 resources :rooms, only: [:index, :new, :create] do 10 resources :messages, only: [:index, :create] 11 end 12 13end 14
試したこと
①messages_controllerのcreateアクションをbinding.pryしました。
paramsは正しく送られていましたが、@message.templateを調べると、NoMethodError: undefined method `template' for nil:NilClassというエラー文が表示されました。
②上記のエラー分から、templateの定義が上手く読み込まれていないと考え、application_controllerに定義されているtemplateをmessages_controllerに移動させましたが、変化はありませんでした。
③render_with_signed_in_userのスペルミスがないか確認しましたが、正しく記述されていると思います。
エラー解決のための方法やアドバイスをいただけますでしょうか。
よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
Rails 6.0.3.7
Mysql
あなたの回答
tips
プレビュー