Вопрос

I have an email template where the user can enter text like this:

Hello {first_name}, how are you?

and when the email actually gets sent it replaces the placeholder text {first_name} with the actual value.

There will be several of these placeholders, though, and I wasn't sure that gsub is meant to be used like this.

body = @email.body.gsub("{first_name}", @person.first_name)gsub("{last_name}", @person.last_name).gsub("",...).gsub("",...).gsub("",...).etc...

Is there a cleaner solution to achieving this functionality? Also, if anyone's done something similar to this, did they find that they eventually hit a point where using multiple gsubs on a few paragraphs for hundreds of emails was just too slow?

EDIT

I ran some tests comparing multiple gsubs vs using regex and it came out that the regex was usually 3x FASTER than using multiple gsubs. However, I think the regex code is a littler harder to read as-is, so I'm going to have to clean it up a bit but it does indeed seem that using regex is significantly faster than multiple gsubs. Since my use case will involve multiple substitutions for a large number of documents, the faster solution is better for me, even though I'll have to add a little more documentation.

Это было полезно?

Решение

You have to put in regular expressions all strings you want to catch and in the hash you put the replacement of all catches:

"123456789".gsub /(123|456)/, "123" => "ABC",
                              "456" => "DEF"

This code only works for ruby 1.9.

If you can use a template library like erb or haml, they are the proper tool for this kind of task.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top