我正在尝试使用Rails并希望在数组中显示数组,这是有效的; index.html.erb的代码位于:
<div id="events">
<% @events.each_with_index do |event, i| %>
<%= link_to event_path(event) do %>
<div class="card">
<div class="image" style="background-image: url('<%= event.image.url %>')"></div>
<div class="text">
<h2><%= event.name %></h2>
<div class="location"><%= event.location %></div>
<date><strong><%= l event.date_start, :format => :day %> – <%= l event.date_end, :format => :day %> <%= l event.date_end, :format => :month %> </strong><%= l event.date_end, :format => :year %></date>
</div>
</div>
<% end %>
<%if i%1 == 1 %>
<% @ads.find(:first) do |ad| %>
<%= ad.name %>
<% end %>
<% end %>
<%if (i+1)%4 == 0 %>
<% @ads.find(:first) do |ad| %>
<a href="<%= ad.url %>" target="_blank" class="ad">
<div class="card">
<%= ad.name %>
</div>
</a>
<% end %>
<% end %>
<% end %>
</div>
和events_controller:
def index
@ads = Ad.all.shuffle
end
到目前为止工作非常好,在4个@events项目之后我得到一个@ads,随机。但是所有@ads 项目总是相同的随机。
如何在页面中显示随机的@ads项目,而不必使用相同的项目两次?
答案 0 :(得分:1)
尝试将@ads.find(:first)
的实例更改为@ads.pop
- pop从数组中删除一个项目并将其返回 - 对该数组的进一步调用将无法获得&#39;弹出&#39;项目了。
a = [ "a", "b", "c", "d" ]
a.pop #=> "d"
a.pop(2) #=> ["b", "c"]
a #=> ["a"]
答案 1 :(得分:0)
而不是
def index
@ads = Ad.all.shuffle
end
您可以使用
def index
@ads = Ad.all.to_a.shuffle
end
将所有Ad
条记录存储在数组中,随机播放
然后在您看来,而不是
<% @ads.find(:first) do |ad| %>
<%= ad.name %>
<% end %>
您可以使用
<% ad = @ads.pop %>
<%= ad.name %>
从而为您提供一个Ad
,并将其从阵列中移除,这样您就不会再次获得
请注意,在这种情况下我们不会使用块
另请注意,当您的数组为空时,ad.name
会引发NoMethodError
,因此您还需要检查