gpt4 book ai didi

ruby-on-rails - rails 4.2 : using deliver_later with a tableless model

转载 作者:行者123 更新时间:2023-12-03 14:44:30 25 4
gpt4 key购买 nike

我正在尝试使用 Rails 4.2 的 Deliver_later 方法设置联系表格。但是,我只能让 Deliver_now 工作,因为 Deliver_later 试图序列化我的对象并且每次都失败。

这是我的设置:

消息 Controller .rb

class MessagesController < ApplicationController
def new
@message = Message.new
end

def create
@message = Message.new(params[:message])
if @message.valid?
ContactMailer.contact_form(@message).deliver_later
redirect_to root_path, notice: "Message sent! Thank you for contacting us."
else
render :new
end
end
end

contact_mailer.rb
class ContactMailer < ApplicationMailer
default :to => Rails.application.secrets['email']

def contact_form(msg)
@message = msg
mail(:subject => msg.subject, from: msg.email)
end
end

消息.rb
class Message
include ActiveModel::Model
include ActiveModel::Conversion

## Not sure if this is needed ##
include ActiveModel::Serialization

extend ActiveModel::Naming

attr_accessor :name, :subject, :email, :body

validates_presence_of :email, :body
validates_format_of :email, with: /\A([^\s]+)((?:[-a-z0-9]\.)[a-z]{2,})\z/i
validates_length_of :body, :maximum => 1000

def initialize(attributes = {})
attributes.each { |name, value| send("#{name}=", value) }
end

## Not sure if this is needed ##
def attribtues
{'name' => nil, 'subject' => nil, 'email' => nil, 'body' => nil}
end
end

调用 ContactMailer.contact_form(@message).deliver_later 时出现的错误是:
ActiveJob::SerializationError in MessagesController#create 

Unsupported argument type: Message
Extracted source (around line #10):
if @message.valid?
ContactMailer.contact_form(@message).deliver_later
redirect_to root_path, notice: "Message sent! Thank you for contacting us."
else
render :new

理想情况下,我希望这是一个后台进程。我很快就会添加像 Sidekiq 这样的东西,但我认为最好事先解决这个序列化问题。

任何帮助表示赞赏!谢谢 :)

最佳答案

避免必须使用 ActiveRecord 支持对象或创建不必要的表的简单解决方案:

除了将 Message 对象传递给 contact_form 方法之外,您还可以将消息参数传递给 contact_form 方法,然后在该方法中初始化 Message 对象。

这将解决问题而无需创建表,因为您正在延迟作业 worker 的内存空间中初始化对象。

例如:

消息 Controller .rb

MessagesController < ApplicationController
def new
@message = Message.new
end

def create
@message = Message.new(params[:message])

if @message.valid?
ContactMailer.contact_form(params[:message]).deliver_later
redirect_to root_path, notice: "Message sent! Thank you for contacting us."
else
render :new
end
end
end

contact_mailer.rb
class ContactMailer < ApplicationMailer
default :to => Rails.application.secrets['email']

def contact_form(msg_params)
@message = Message.new(msg_params)
mail(:subject => msg.subject, from: msg.email)
end
end

关于ruby-on-rails - rails 4.2 : using deliver_later with a tableless model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27898183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com