Sto provando a configurare un modulo di contatto utilizzando il metodo deliver_later di Rails 4.2. Tuttavia, posso solo consegnare deliver_now al lavoro, poiché deliver_later sta tentando di serializzare il mio oggetto e fallisce ogni volta.Rails 4.2: uso di deliver_later con un modello senza tablature
Ecco la mia messa a punto:
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
L'errore che ottengo quando si chiama 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
Idealmente mi piacerebbe che questo sia un processo in background. Aggiungerò presto qualcosa come Sidekiq ma penso che sia meglio che risolvo il problema di serializzazione in anticipo.
Qualsiasi aiuto è apprezzato! Grazie :)
Ho finito per utilizzare solo 'ActiveRecord' e il suo sottostante. – DaniG2k
@ DaniG2k come hai usato ActiveRecord con un modello senza tablature? – Marklar
@Marklar Penso che stia dicendo che ha usato un tavolo sottostante. – Nick