我有一个Rails 4.2应用程序,它有一个评级系统。我想将演示者逻辑移动到帮助器中。我想根据排名是否完整来显示明星或半明星。
module ThingHelper
def calculate_stars(thing)
output = ""
total = thing.overall_average
thing.overall_average.ceil.times do |n|
if total >= 1
output += content_tag(:i, "<%= fa_icon 'star' %>")
total -= 1
else
output += content_tag(:i, "<%= fa_icon 'star-half' %>")
end
end
return output
end
end
在我的erb模板中,我有这个:
<%= calculate_stars(thing).html_safe %>
然而,它只是列出了这样的字符串:&#34;&lt;%= fa_icon&#39; star&#39; %GT;&#34 ;.我尝试过使用raw
以及使用concat
代替+=
,但两种尝试的解决方案都只是渲染字符串。
我也尝试过没有content_tag
帮助器,但这不起作用。
我咨询了以下内容: http://apidock.com/rails/ActionView/Helpers/TagHelper/content_tag,How to embed font-awesome icons into submit_tag,raw vs. html_safe vs. h to unescape html和Ruby on Rails display half a star for a decimal rating, e.g. 4.5。
我错过了什么?感谢
修改
我不相信这可以在助手中完成,所以我只需将逻辑放在视图中。基本上,我舍入并计算满星的数量然后有条件地添加另一个基于舍入。
答案 0 :(得分:2)
您制作的两个错误超级小。
首先,在您为内容标记提供的参数中。 Take a look at the documentation。在第一个例子......
content_tag(:p, "Hello world!")
# => <p>Hello world!</p>
字符串是在标签之间的内容。但是,Font Awesome icons需要设置为代码的类,<i></i>
之间的无内容。
这意味着你需要传递content_tag
一个空字符串和一个哈希...
<%= content_tag(:i, "", class: "fa-icon star") %>
=> "<i class="fa_icon star"></i>"
我知道你正在做其他事情来增加星星和诸如此类的东西。我想你能从这里拿走它......
答案 1 :(得分:0)
您无需为输出声明字符串。
module ThingHelper
def calculate_stars(thing)
total = thing.overall_average
thing.overall_average.ceil.times do |n|
if total >= 1
content_tag(:i, :class => "fa fa-list") do
end
total -= 1
else
content_tag(:i, :class => "fa fa-list") do
end
end
end
end
end
然后渲染你的erb:
<%= calculate_stars(thing) %>
请注意,我正在为我的图标使用bootstrap和glyphicons。只需更改图标类。
我在开发过程中试过这个并制作了这个: