How do I share common functions between templates


#1

Hi,

I have a snippet as following and want to share it in mulitiple templates. Is
there a way to do it?

thanks,

Xianfeng

<%
def output_array(s)
str = ''
if s.is_a?(Array)
if s.length >= 1
str = s.at(0)
str = “”#{str}""
if s.length > 1
for i in 1…(s.length - 1)
w = s.at(i)
str = "#{str}, “#{w}”“
end
end
end
end
”#{str}"
end
%>


#2

Partials are a new feature in chef (just merged to master, in fact:
https://github.com/opscode/chef/pull/498)

For now, I’m not sure there is a good solution. You can possibly use ERB to
evaluate the a subtemplate and pass that into a template via variables.

On Mon, Jan 14, 2013 at 2:38 PM, xyuan@mspot.com wrote:

Hi,

I have a snippet as following and want to share it in mulitiple templates.
Is
there a way to do it?

thanks,

Xianfeng

<%
def output_array(s)
str = ''
if s.is_a?(Array)
if s.length >= 1
str = s.at(0)
str = “”#{str}""
if s.length > 1
for i in 1…(s.length - 1)
w = s.at(i)
str = "#{str}, “#{w}”“
end
end
end
end
”#{str}"
end
%>


#3

Surely, we can all agree to call these something more chef-fy…a "buffet"
or “serving dish”.

On Mon, Jan 14, 2013 at 3:02 PM, Josiah Kiehl bluepojo@gmail.com wrote:

Partials are a new feature in chef (just merged to master, in fact:
https://github.com/opscode/chef/pull/498)

For now, I’m not sure there is a good solution. You can possibly use ERB
to evaluate the a subtemplate and pass that into a template via variables.

On Mon, Jan 14, 2013 at 2:38 PM, xyuan@mspot.com wrote:

Hi,

I have a snippet as following and want to share it in mulitiple
templates. Is
there a way to do it?

thanks,

Xianfeng

<%
def output_array(s)
str = ''
if s.is_a?(Array)
if s.length >= 1
str = s.at(0)
str = “”#{str}""
if s.length > 1
for i in 1…(s.length - 1)
w = s.at(i)
str = "#{str}, “#{w}”“
end
end
end
end
”#{str}"
end
%>


#4

Bryan,

Personally when I have more complicated logic in a template I’ll factor
that out into a library method, which I then call directly in the
template… Only draw back here is that the node data isnt available in
the Library, so I have to pass that into the method…



<%= Prism.build_network_access_point(node) %>

hope that helps

-John

On Mon, Jan 14, 2013 at 6:04 PM, Bryan Stenson bryan.stenson@gmail.comwrote:

Surely, we can all agree to call these something more chef-fy…a "buffet"
or “serving dish”.

On Mon, Jan 14, 2013 at 3:02 PM, Josiah Kiehl bluepojo@gmail.com wrote:

Partials are a new feature in chef (just merged to master, in fact:
https://github.com/opscode/chef/pull/498)

For now, I’m not sure there is a good solution. You can possibly use ERB
to evaluate the a subtemplate and pass that into a template via variables.

On Mon, Jan 14, 2013 at 2:38 PM, xyuan@mspot.com wrote:

Hi,

I have a snippet as following and want to share it in mulitiple
templates. Is
there a way to do it?

thanks,

Xianfeng

<%
def output_array(s)
str = ''
if s.is_a?(Array)
if s.length >= 1
str = s.at(0)
str = “”#{str}""
if s.length > 1
for i in 1…(s.length - 1)
w = s.at(i)
str = "#{str}, “#{w}”“
end
end
end
end
”#{str}"
end
%>


#5

Tapas?

On Mon, Jan 14, 2013 at 5:04 PM, Bryan Stenson bryan.stenson@gmail.comwrote:

Surely, we can all agree to call these something more chef-fy…a "buffet"
or “serving dish”.

On Mon, Jan 14, 2013 at 3:02 PM, Josiah Kiehl bluepojo@gmail.com wrote:

Partials are a new feature in chef (just merged to master, in fact:
https://github.com/opscode/chef/pull/498)

For now, I’m not sure there is a good solution. You can possibly use ERB
to evaluate the a subtemplate and pass that into a template via variables.

On Mon, Jan 14, 2013 at 2:38 PM, xyuan@mspot.com wrote:

Hi,

I have a snippet as following and want to share it in mulitiple
templates. Is
there a way to do it?

thanks,

Xianfeng

<%
def output_array(s)
str = ''
if s.is_a?(Array)
if s.length >= 1
str = s.at(0)
str = “”#{str}""
if s.length > 1
for i in 1…(s.length - 1)
w = s.at(i)
str = "#{str}, “#{w}”“
end
end
end
end
”#{str}"
end
%>


#6

Xianfeng,

The responses so far are very good answers to the general question. I
think the best solution for your case is John’s solution. However, I
thought I might mention that the specific ruby code you posted could be
simplified quite a bit. I would write that as

my_array.join(’, ') if my_array.is_a?(Array)

Actually, I just noticed that your method surrounds each element in the
array with escaped double quotes. If you want that, you could do

my_array.map{ |s| “”#{s}"" }.join(’, ') if my_array.is_a?(Array)

-Matt Moretti

On Mon, Jan 14, 2013 at 9:52 PM, Sascha Bates sascha.bates@gmail.comwrote:

Tapas?

On Mon, Jan 14, 2013 at 5:04 PM, Bryan Stenson bryan.stenson@gmail.comwrote:

Surely, we can all agree to call these something more chef-fy…a
"buffet" or “serving dish”.

On Mon, Jan 14, 2013 at 3:02 PM, Josiah Kiehl bluepojo@gmail.com wrote:

Partials are a new feature in chef (just merged to master, in fact:
https://github.com/opscode/chef/pull/498)

For now, I’m not sure there is a good solution. You can possibly use ERB
to evaluate the a subtemplate and pass that into a template via variables.

On Mon, Jan 14, 2013 at 2:38 PM, xyuan@mspot.com wrote:

Hi,

I have a snippet as following and want to share it in mulitiple
templates. Is
there a way to do it?

thanks,

Xianfeng

<%
def output_array(s)
str = ''
if s.is_a?(Array)
if s.length >= 1
str = s.at(0)
str = “”#{str}""
if s.length > 1
for i in 1…(s.length - 1)
w = s.at(i)
str = "#{str}, “#{w}”“
end
end
end
end
”#{str}"
end
%>