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

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

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

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

Q&A

0回答

328閲覧

RailsのJobのperformにcurrent_userを送りたい。

HTMLdoc

総合スコア67

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/06/19 08:15

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

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問