Проблема реализации ActiveModel с атрибутами класса при использовании DelayedJob - PullRequest
2 голосов
/ 09 августа 2011

Я использую Ruby on Rails 3.0.9 и DelayedJob 2.1, и я пытаюсь реализовать форму «Свяжитесь с нами» самостоятельно, используя функциональные возможности ActiveModel. Итак ...

... в моем файле модели:

class ContactUs
  include ActiveModel::Conversion
  include ActiveModel::Validations


  attr_accessor :full_name, :email, :subject, :message

  def initialize(attributes = {})
    attributes.keys.each do |attr|
      instance_variable_set "@" + attr.to_s, attributes[attr.to_sym]
    end
  end


  validates :full_name,
    :presence   => true

  validates :email,
    :presence   => true

  validates :subject,
    :presence   => true

  validates :message,
    :presence   => true


  def persist
    @persisted = true
  end

  def persisted?
    false
  end
end

... в моем файле просмотра у меня есть:

<%= form_for @contact_us, :url => contact_us_path do |f| %>
  <%= f.text_field :full_name %>
  <%= f.text_field :email %>
  <%= f.text_field :subject %>
  <%= f.text_area  :message %>
<% end %>

... в моем файле роутера есть:

match 'contact_us' => 'pages#contact_us', :via => [:get, :post]

... в моем файле контроллера у меня есть:

class PagesController < ApplicationController
  def contact_us
    case request.request_method

    when 'GET'
      @contact_us = ContactUs.new

    when 'POST'
      @contact_us = ContactUs.new(params[:contact_us])

      # ::Pages::Mailer.delay.contact_us(@contact_us) # If I use this code, I will get an error with the 'full_name' attribute (read below for more information)
      ::Pages::Mailer.contact_us(@contact_us).deliver # If I use this code, it will work
    end
  end
end

Все работает, кроме случаев, когда я использую код ::Pages::Mailer.delay.contact_us(@contact_us) с методом full_name, относящимся к атрибуту класса full_name в шаблоне электронной почты (однако он работает, когда в шаблоне электронной почты I не вызовите метод full_name). То есть, когда я использую следующий шаблон электронной почты с Dalayed Job, я получаю undefined method 'full_name\' for #<ContactUs:0x000001041638c0> \n/RAILS_ROOT/app/views/pages/mailer/contact_us.html.erb:

MESSAGE CONTENT:
<br /><br />

<%= @message_content.full_name %> # If I comment out this line it will work.
<br />
<%= @message_content.email %>
<br />
<%= @message_content.subject %>
<br />
<%= @message_content.message %>

Когда я использую вышеуказанный шаблон электронной почты без Dalayed Job (то есть с кодом ::Pages::Mailer.contact_us(@contact_us).deliver), он работает.

Код почтовой программы:

class Pages::Mailer < ActionMailer::Base
  default_url_options[:host] = <my_web_site_URL>
  default :from => "<my_email_address@provaider_name.com"

  def contact_us(message_content)
    @message_content = message_content

    mail(
      :to      => <my_email_address@provaider_name.com>,
      :subject => "Contact us"
    ) do |format|
      format.html
    end
  end
end

Однако, если я отправляю простое электронное письмо (используя ::Pages::Mailer.delay.contact_us(@contact_us)), содержащее @message_content.inspect вместо @message_content.full_name, я получаю следующий вывод (обратите внимание, что переменная экземпляра full_name существует!), Когда я получаю электронное письмо :

#<ContactUs:0x000001013fc378 @full_name="Sample name text", @email="sample@email_provider.com", @subject="Sample subject text", @message="Sample message text", @validation_context=nil, @errors={}> 

В чем проблема с Dalayed Job и как я могу это решить?


Я действительно не понимаю, почему это происходит, поскольку у меня full_name работает как, например, атрибут email, для которого все работает. Я также попытался перезапустить свой сервер Apache2.

1 Ответ

0 голосов
/ 19 июля 2013

К сожалению, DelayedJob не допускает средства доступа к атрибутам в моделях.Я узнал, что тяжелый путь, после многих, многих часов попыток заставить его работать.Если вы создадите пользовательское задание DelayedJob, вы сможете создавать атрибуты специально для класса этого задания.

...