我正试图弄清楚如何根据用户计划仅显示一定数量的类别。所以在我的控制器中我有以下内容;
def check_plan?
User.current.plan_id == "" && User.current.bins.count == 2 || User.current.plan_id == "nil" && User.current.bins.count == 2
end
helper_method :check_plan?
注意:我知道,不是很漂亮,但它现在会做。所以基本上:check_plan?检查一些事情。
现在我想,我可以将它用作我们的类别列表作为起点,这样如果用户不在任何计划中,如果他们在计划中它们全部显示,则他们仅限于显示2。这是我认为可行的,但事实并非如此。我之前已经完成了,但是不记得它到底是怎么回事,所以任何帮助都会受到赞赏。
<% if check_plan? %>
<% @bin_list.order("position").limit(2).each do |bin| %>
<% else %>
<% @bins_list.order("position").each do |bin| %>
<% end %>
不是真的有效,我知道为什么,但他们的意志是我所有的其他尝试将这些线与check_plan结合在一起。
答案 0 :(得分:2)
这种逻辑本质上属于模型。不要滥用帮手。
class User < ActiveRecord::Base
def bin_limit
check_plan? ? 0 : 2
end
def check_plan?
# Your logic
end
def bins_with_limit
bins.with_limit(bin_limit)
end
end
class Bin < ActiveRecord::Base
def self.with_limit(limit)
return self if limit <=0
self.limit(limit)
end
end
查看
current_user.bins_with_limit.each do |bin|
答案 1 :(得分:1)
首先,rails方法.blank?
将为“”或“nil”返回true,因此您可以从重构代码开始,如下所示:
def check_plan?
( User.current.plan_id.nil? || User.current.plan_id.blank? ) && User.current.bins.count == 2
end
helper_method :check_plan?
其次,您在下面的代码中调用了块,因此您需要使用end
<% if check_plan? %>
<% @bin_list.order("position").limit(2).each do |bin| %>
<% end %>
<% else %>
<% @bins_list.order("position").each do |bin| %>
<% end %>
<% end %>
当然,您需要在上面的bin
和do
部分之间添加end
内容。