Pregunta

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.

¿Fue útil?

Solución

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top