2016-06-13 1 views
-1

Я внедряю SmsService для отправки текстового сообщения на телефон пользователя. SmsService получает содержимое текстового сообщения от SmsContent:Получить шаблон строки из файла и автоматически привязать данные

class SmsContent 
    def initialize(sms_type, data) 
    @sms_type = sms_type 
    @data = data 
    end 

    def get_content 
    sms_template_one_way = 'Hello #{customer_name}, this is your one way itinerary from #{depart_place} to #{arrive_place} ...' 
    sms_template_round_trip = 'Hello #{customer_name}, this is your round trip itinerary from #{depart_place} to #{arrive_place} ...' 

    customer_name = @data.customer_name 
    depart_place = @data.depart_place 
    arrive_place = @data.arrive_place 

    if @sms_type == 1 
     sms_content = sms_template_round_trip 
    else 
     sms_content = sms_template_one_way 
    end 

    sms_content 
    end 
end 

Я должен хранить свой шаблон сообщения в качестве String переменных. Как я могу реорганизовать этот код? В частности, как я могу хранить шаблоны сообщений в файле и автоматически привязывать данные к шаблону?

+0

просто используйте метод «render». –

+0

Я новый парень из Ruby, так что было бы неплохо, если бы вы приводили пример ссылки для рендеринга этого –

+0

. Обратите внимание, что ваш шаблон, как они сейчас, сможет выполнить произвольный код ruby. Таким образом, вы никогда не должны принимать их от пользователя, иначе пользователь может выполнить произвольный код в вашем приложении (который забирает пароли, меняет данные, ...). Если вы хотите принять эти шаблоны для пользователя, вы должны использовать безопасный язык шаблонов, например [Liquid] (https://shopify.github.io/liquid/). –

ответ

0
class SmsContent 
    def initialize(sms_type, data); @sms_type, @data = sms_type, data end 
    def get_content 
    "Hello %{customer_name}, this is your %{sms_type} itinerary "\ 
    "from %{depart_place} to %{arrive_place} ..." % 
    { 
     sms_type:  @sms_type == 1 ? "round trip" : "one way", 
     customer_name: @data.customer_name, 
     depart_place: @data.depart_place, 
     arrive_place: @data.arrive_place, 
    } 
    end 
end 
0

Сначала сделайте частичный файл в приложение/просмотров/sms_content/_get_content.html.erb

_get_content.html.erb

<% if @sms_type == 1 %> 
    Hello <%= @data.customer_name %>, this is your one way itinerary from <%= @data.depart_place %> to <%= @data.arrive_place %> ... 
<% else %> 
    Hello <%= @data.customer_name %>, this is your round trip itinerary from <%= @data.depart_place %> to <%= @data.arrive_place %> ... 
<% end %> 

В вашем SmsContent классе get_content метод

def get_content 
    render :partial => "sms_content/get_content" 
end 

Этот шо uld work

0

Как я указал в своем комментарии выше, встроенный Rails 'I18n API предназначен для этой цели. Во-первых, хранить строки шаблонов в каталоге config/locales/:

# config/locales/en.yml 
en: 
    sms_template: 
    one_way: 
     Hello %{customer_name}, this is your one way itinerary 
     from %{depart_place} to %{arrive_place} ... 
    round_trip: 
     Hello %{customer_name}, this is your round trip itinerary 
     from %{depart_place} to %{arrive_place} ... 

Обратите внимание, что этот формат использует %{...}а-ляsprintf для интерполяции вместо #{...}.

Тогда:

def get_content 
    template_name = @sms_type == 1 ? "round_trip" : "one_way" 
    I18n.t("sms_template.#{template_name}", @data.attributes) 
end 

Вот оно! Одно замечание: вышесказанное предполагает, что @data - объект ActiveModel (или что-то, что отвечает на attributes с помощью Hash); если это не так, вам нужно сначала создать Hash.

Смежные вопросы