Ich versuche, ein Kontaktformular mit Rails 4.2 Deliver_later Methode einzurichten. Allerdings kann ich deliver_now nur zum Arbeiten bringen, da deliver_later versucht, mein Objekt zu serialisieren und jedes Mal fehlschlägt.Schienen 4.2: Verwenden von deliver_later mit einem tableless Modell
Hier ist mein Setup:
messages_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
message.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
Der Fehler, den ich bekommen, wenn ContactMailer.contact_form(@message).deliver_later
Aufruf ist:
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
Im Idealfall würde Ich mag diese ein Hintergrundprozess sein. Ich werde bald etwas wie Sidekiq hinzufügen, aber ich denke, es ist das Beste, wenn ich dieses Serialisierungsproblem vorher behebe.
Jede Hilfe wird geschätzt! Danke :)
Ich landete nur mit 'ActiveRecord' und seine zugrunde liegende. – DaniG2k
@ DaniG2k Wie haben Sie ActiveRecord mit einem tabellenlosen Modell verwendet? – Marklar
@Marklar Ich denke, er sagt, dass er einen zugrunde liegenden Tisch verwendet hat. – Nick