message_broadcast_job.rb
rb
1class MessageBroadcastJob < ApplicationJob 2 queue_as :default 3 4 def perform(message, user) 5 ActionCable.server.broadcast "room_channel_#{message.room_id}", message: render_message(message, user) 6 7 8 # puts "=-------------------------" 9 10 # binding.pry 11 end 12 private 13 14 def render_message(message) 15 # ApplicationController.renderer.render(partial: 'messages/message', locals: { message: message }) 16 ApplicationController.render_with_signed_in_user(user,partial: 'messages/message', locals: { message: message}) 17 18 end 19end
performにcurrent_userを渡して、
def perform(message, user)
で
current_userを持っていきたいです。(userの中にcurrent_userが入ってるような状態)
コード
message.rb
rb
1class Message < ApplicationRecord 2 belongs_to :user, optional: true 3 belongs_to :room 4 belongs_to :usermanager, optional: true 5 after_update_commit { EditBroadcastJob.perform_later self } 6 after_create_commit { MessageAdminBroadcastJob.perform_later self, User.current} 7 8 # after_create_commit { MessageBroadcastJob.perform_later self} 9 # after_create_commit { MessageAdminBroadcastJob.perform_later self, User.current} 10 # after_update_commit { EditBroadcastJob.perform_later self } 11 # has_rich_text :content 12 validates :content, length: {maximum: 1000 } 13 mount_uploader :image, ImageUploader 14 validate :image_size 15 private 16 17 def image_size 18 if image.size > 5.megabytes 19 errors.add(:image, "容量が大きすぎます。5MB未満のファイルにしてください。") 20 end 21 end 22end 23 24
user.rb
rb
1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable, :omniauthable, :trackable 6 has_many :messages, dependent: :destroy 7 has_many :rooms, dependent: :destroy 8 has_many :usermanagers, dependent: :destroy 9 has_many :passwordmanagers, dependent: :destroy 10 def self.current 11 Thread.current[:current_user] 12 end 13 14 def self.current=(usr) 15 Thread.current[:current_user] = usr 16 end 17 protected 18 def self.find_for_google(auth) 19 user = User.where(uid: auth.uid, provider: auth.provider).first 20 unless user 21 user = User.create!(name: auth.info.name, 22 email: User.dummy_email(auth), 23 provider: auth.provider, 24 token: auth.credentials.token, 25 password: Devise.friendly_token[0, 20], 26 uid: auth.uid) 27 end 28 user 29 end 30 private 31 32 def self.dummy_email(auth) 33 "#{auth.uid}-#{auth.provider}@example.com" 34 end 35end 36
ApplicationController.rb
rb
1class ApplicationController < ActionController::Base 2 protect_from_forgery 3 # ApplicationController.render 'messages/message' 4 before_action :set_current_user 5 6 before_action :configure_permitted_parameters, if: :devise_controller? 7 before_action :search 8 def configure_permitted_parameters 9 devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) 10 end 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 17 18 def set_current_user 19 if current_user.present? 20 User.current = current_user 21 end 22 end 23 24 def search 25 @q = Room.ransack(params[:q]) 26 @rooms = @q.result(distinct: true).where(public: true) 27 end 28end 29
あなたの回答
tips
プレビュー