2016-08-11 2 views
0

Я хочу иметь возможность в своем приложении rails получать входящие письма и анализировать их определенным образом.Rails Email Parsing

incoming_controller.rb

class IncomingController < ApplicationController 
    skip_before_action :verify_authenticity_token, only: [:create] 
    skip_before_action :authenticate_user!, only: [:create] 
    def create 
    # Find the user 
    user = User.find_by(email: params[:sender]) 

    # Find the topic 
    topic = Topic.find_by(title: params[:subject]) 

    # Assign the url to a variable after retreiving it from 
    url = params["body-plain"] 

    # If the user is nil, create and save a new user 
    if user.nil? 
     user = User.new(email: params[:sender], password: "password") 
     user.save! 
    end 

    # If the topic is nil, create and save a new topic 
     if topic.nil? 
     topic = Topic.new(title: params[:subject], user: user) 

     topic.save! 
     end 

     bookmark = topic.bookmarks.build(user: user, url: url, description: "bookmark for #{url}") 

     bookmark.save! 

    # Assuming all went well. 
    head 200 
    end 
end 

С помощью этого контроллера можно извлечь только 3 значения = пользователь: отправитель, тема: тема и URL "тело-равнинных".

Как добавить 4-е значение в электронном письме для анализа a: description?

ответ

1

реализация params[:description] теоретически должна работать так же, как и другие params предметов, используемых в методе, вам просто нужно, чтобы убедиться, что это все, что вызывает ваше IncomingController#create действие посылает :description параметров.

Или, если вы не можете добавить параметры ко всему, что вызывает действие контроллера, возможно, вы можете добавить его в params['body-plain'], который вы используете в настоящее время для url? Можно хранить несколько полей в теле сообщения электронной почты, используя упорядоченный формат текста, например (с помощью YAML):

url: http://example.com 
description: I'm a description 

Тогда в контроллере, вы бы разобрать, что поле, как это:

class IncomingController < ApplicationController 
    require 'yaml' 
    def create 
    # ... 
    body_params = YAML.load(params['body-plain']) 
    url = body_params[:url] 
    description = body_params[:description] 
    # ... 
    end 
end 
+0

Как я могу установить текст в письме, чтобы он был признан в качестве описания? Например, я поставил тему письма равным теме. Что я могу задать из письма, чтобы оно соответствовало описанию? – davefogo

+0

Это зависит от того, что вызывает ваш контроллер ... Я предполагаю, что у вас есть какая-то настройка приема электронной почты, которая анализирует электронные письма в хеш-файл и передает на ваш контроллер действие? Если вы можете это контролировать, вы можете добавить параметр в хэш. Если вы не можете этого сделать, вы можете добавить его в тело электронной почты, как я объяснил в своем отредактированном ответе. – rmhunter

+0

Я пытаюсь использовать метод, который вы указали в ответе, но url и описание не получают из параметров. Он читает их как ноль. – davefogo