Есть несколько способов сделать это. Обычная техника - установить from / reply_to в качестве настраиваемого адреса электронной почты, который позволяет вам искать исходный объект. Что-то вроде:
class Comment < ActiveRecord::Base
belongs_to :commentable
has_many :comments, :as => :commentable
before_validation :generate_token, :on => :create
validates :token, :presence => true, :uniqueness => true
attr_accessible :token
private
def generate_token
...
end
end
Электронная почта отправляется с адресом from / reply_to, например [token] @ msg.yoursite.com
(Вы также можете использовать комментарии + [token_or_id] @ msg.yoursite.com, если хотите, - см. Параметр одноразового использования, предоставляемый cloudmailin)
class IncomingMailsController < ApplicationController
def create
@comment = Comment.find_by_token(params[:to].split('@')[0])
@comment.comments.create(:body => params[:plain])
render :text => 'success', :status => 200
end
end
Если вы перейдете на [token] @ msg.yoursite.com, вам необходимо правильно настроить записи DNS, как описано здесь .
Другой вариант - хранить содержимое в заголовках письма. Может быть, ваши заголовки будут выглядеть примерно так:
X-YOURAPP-OBJECT-ID = 44
X-YOURAPP-OBJECT-TYPE = Job
X-YOURAPP-TARGET-ASSOC = comments
X-YOURAPP-TARGET-ATTR = body
Тогда ваш контроллер будет выглядеть примерно так:
class IncomingMailsController < ApplicationController
def create
headers = Mail::Header.new(params[:message])
object= headers[:x_yourapp_object_type].constantize.find(headers[:x_yourapp_object_id])
object.send(headers[:x_yourapp_target_assoc]).create(headers[:x_yourapp_target_attr] => params[:plain])
render :text => 'success', :status => 200
end
end
Преимущество такого способа состоит в том, что он полностью универсален. Вы можете оставлять комментарии к вакансиям, комментарии к комментариям или что угодно. Если вы создаете другую модель, для которой вы также хотите разрешить ответ по электронной почте ... просто обновите заголовки, и все готово. Единственная проблема заключается в том, что вы должны быть осторожны с удалением этих заголовков почтовыми клиентами. Посмотрите эту тему для получения дополнительной информации об этом.
В настоящее время я использую первую технику, и она работает очень хорошо. Тем не менее, я буду рефакторинг и попробую второй метод в конце этой недели.