How do I break out of this if and each statement? - ruby

I have the following where I want to output the first six users, and if there are more than six, just return '...'.
How would I do this?
<% users.each_with_index do |x, key| %>
<% if key <= 5 %>
<%=x.name %>
<% else %>
... <% next %>
<% end %>
<% end %>

What is the last next for ? Next will just go to the next iteration. You need to use break if you want to go out of the loop.
<%
users.each_with_index do |user, key|
if key > 5
concat('...')
break
end
concat(user.name)
end
%>
You could also
<%= users.take(6).map(&:name).join %>
<%= '...' if users.size > 6 %>

Related

Algebraic number signs manipulation in ERB templates

I have an ERB template:
<%
a = rand(-10..10)
b = rand(-10..10)
c = rand(-10..10)
%>
The solution of this equation $<%=a%>x + <%=b%> = <%=c%>$ is
$<%=a%>x = <%=c%> - <%=b%>$
...
The problem is that when b is negative I get double minus. Example:
$2x = 4--2$
# a = 2, b= -2, c= 3, I get
Is there a way to avoid that and put + instead of --
Use an if statement:
<%= b > 0 ? '-' : '+' %>
You might also want to consider doing something different (but I don't know what!) if b == 0?
This would work: (instead of -b you could also say b.abs)
<% if b.negative? -%>
$<%= a %>x = <%= c %> - <%= -b %>$
<% else -%>
$<%= a %>x = <%= c %> + <%= b %>$
<% end -%>
Or, via string manipulation:
$<%= a %>x = <%= "#{c} + #{b}".sub('+ -', '- ') %>$

How to change the order for two items in .each in ruby

I have a function in my .erb file and in it I have the following:
<%select id ="dropdown">
<option disabled selected value="select"> - select - </option>
<% #variable.each do |x| %>
<%= "<option value='#{x['code']}'>#{x['description']} </option>".html_safe %>
<% end %>
<%/select>
But I need to have two items (TUA and CRL) to be displayed at the top and the rest to be displayed in alpha order (which currently is) so it should be .
<%select id ="dropdown">
<option disabled selected value="select"> - select - </option>
<% #variable.each do |x| %>
<% next if x['code'] == 'TUA' or x['code'] == 'CRL' %>
<%= "<option value='#{x['code']}'>#{x['description']} </option>".html_safe %>
<% end %>
<%/select>
How can I do that ? I have hardcoded it and I don't want that.
Not sure how #variable is declared, but what if you try arranging it in the controller?
#variable = []
#variable << Variable.find_by(code: 'TUA')
#variable << Variable.find_by(code: 'CRL')
#variables = Variable.all.order('code DESC')
#variables.each do |x|
if x.code != 'TUA' && x.code!= 'CRL'
#variable << x
end
end

.each returning entire array after iterating through each element [duplicate]

This question already has an answer here:
Rails in rendering unnecessary information
(1 answer)
Closed 8 years ago.
I have a function in ruby
def words
ret =""
res = Net::HTTP.start(url.host, url.port) {|http|http.request(req)}
res.body.each_line do |line|
words = line.split("\"")
ret << words[1] << " "
end
return ret
end
say ret returns "Bill Dan Mike Sarah".
in my view I am doing
<%= #class.words.split(" ").each do |name| %>
<p><%= name %></p>
<% end %>
Instead of just displaying each name on a line, it does
Bill
Dan
Mike
Sarah
["Bill", "Dan", "Mike", "Sarah"] #this shouldn't be printed
What is causing it to display the entire array there at the end? How do I prevent this?
Remove an extra = from first line in each:
<% #class.words.split(" ").each do |name| %>
<p><%= name %></p>
<% end %>

Chef erubis template: Format output based on value's classes

In my Chef cookbook (for mailman), I want use an attribute that is a hash and contains all the configuration options I want to write into a template (similar to how it's done in the chef-client cookbook).
So I want to have in my attributes:
default[:myapp][:config] = {
"I_AM_A_STRING" => "fooo",
"I_AM_AN_INT" => 123,
"I_AM_AN_ARRAY" => ["abc", "cde"]
}
As output, I want the following (mailman compatible):
I_AM_A_STRING = 'fooo'
I_AM_AN_INT = 123
I_AM_AN_ARRAY = ['abc', 'cde']
However, it does not work.
To debug the problem, I have the following code in my erubis template:
<% node[:myapp][:config].each_pair do |key, value| -%>
<% case value.class %>
<% when Chef::Node::ImmutableArray %>
# <%= key %> is type <%= value.class %>, used when Chef::Node::ImmutableArray
<%= key %> = ['<%= value.join("','") %>']
<% when Fixnum %>
# <%= key %> is type <%= value.class %>, used when Fixnum
<%= key %> = <%= value %> #fixnum
<% when String %>
# <%= key %> is type <%= value.class %>, used when String
<%= key %> = '<%= value %>' #string
<% else %>
# <%= key %> is type <%= value.class %>, used else
<%= key %> = '<%= value %>'
<% end -%>
<% end -%>
So I want to use the case .. when to distinguish between value.class. However, none of the when conditions matches. So the output is:
# I_AM_A_STRING is type String, used else
I_AM_A_STRING = 'fooo'
# I_AM_AN_INT is type Fixnum, used else
I_AM_AN_INT = '123'
# I_AM_AN_ARRAY is type Chef::Node::ImmutableArray, used else
I_AM_AN_ARRAY = '["abc", "cde"]'
When I try when Whatever.class, the first when matches for all types.
What am I doing wrong?
Looks like you mean
<% case value %>
instead of
<% case value.class %>
That's how case..when works in ruby. It's often the case you need to switch based on value (or even a range of values ), and also on type.
It let's you do things like this in ruby (and hence also in erubis/eruby):
def f(x)
case x
when String then "#{x} is a String"
when 42 then "It's #{x==42}, x is 42"
when 21..27 then "#{x} is in 21..27"
when Fixnum then "#{x} is numeric, that's all I know"
else "Can't say."
end
end
f(1) # "1 is numeric, that's all I know"
f(25) # "25 is in 21..27"
f("hello") # "hello is a String"
f(false) # "Can't say."

get ruby hash key value using Erubis

I have a hash:
hash = "email_address"=>"test#example.com"
I would like to get the value from this hash which is "test#example.com" using erubis. This doesn't work:
<%
pp hash.[email_address]
%>
Did you try this?
<%= pp hash["email_address"] %>
or
<%= pp hash[:email_address] %>

Resources