Rails 4:如何将循环逻辑放入控制器内部
Rails 4: How to put loop logic inside the controller
我的 haml 文档中有四个循环用于测试目的,唯一的区别是元素的顺序。
我是否能够以某种方式将逻辑放入我的控制器中,并在我的 haml 文档中仅列出一次循环的整个 'insidyness'?
目前,我将所有内容都复制了 4 次,你知道,这感觉很糟糕。 :)
例如:
- @loop.where(featured: true).order("RANDOM()").limit(4).each do |item|
%li
%h1 This is an example
- @loop.order(:cached_votes_up => :desc).limit(4).each do |item|
%li
%h1 This is an example
- @loop.order(:impressions_count => :desc).limit(4).each do |item|
%li
%h1 This is an example
- @loop.order("created_at DESC").limit(4).each do |item|
%li
%h1 This is an example
控制器:
def index
@loop = Item.all
end
我想将我的 Haml 代码缩减为这样的代码,并将其余代码移至控制器中:
- @loop.each do |item|
%li
%h1 This is an example
预先感谢每个回答!
在 Item
模型中 class:
scope :featured_with_random_order_desc, ->(limit_value) { where(featured: true).order("RANDOM()").limit(limit_value) }
scope :by_cached_votes_order_desc, ->(limit_value) { order(:cached_votes_up => :desc).limit(limit_value) }
scope :by_impression_count_order_desc, ->(limit_value) { order(:impressions_count => :desc).limit(limit_value) }
scope :by_created_at_desc, ->(limit_value) { order("created_at DESC").limit(limit_value) }
您认为:
- @loop.featured_with_random_order_desc(4).each do |item|
%li
%h1 This is an example
- @loop.by_cached_votes_order_desc(4).each do |item|
%li
%h1 This is an example
- @loop.by_impression_count_order_desclimit(4).each do |item|
%li
%h1 This is an example
- @loop.by_created_at_desc.limit(4).each do |item|
%li
%h1 This is an example
您可以更进一步,为控制器中的每个循环创建变量:
def index
@loop_featured = Item.featured_with_random_order_desc(4)
@loop_cached_votes = Item.by_cached_votes_order_desc(4)
@loop_impression_counts = Item.by_impression_count_order_desclimit(4)
@loop_by_created = Item.by_created_at_desc(4)
end
并在视图中使用它们:
- @loop_featured.each do |item|
%li
%h1 This is an example
- @loop_cached_votes.each do |item|
%li
%h1 This is an example
- @loop_impression_counts.each do |item|
%li
%h1 This is an example
- @loop_by_created.each do |item|
%li
%h1 This is an example
您不能多次渲染视图,但您可以这样做。
def index
@loops = [
Item.where(featured: true).order("RANDOM()"),
Item.order(:cached_votes_up => :desc),
Item.order(:impressions_count => :desc),
Item.order("created_at DESC")
]
end
然后在模板中
- @loops.each do |loop|
- loop.limit(4).each do |item|
%li
%h1 This is an example
您可以使用 ActiveRecord
中的 union_scope
#item.rb
include ActiveRecord::UnionScope
scope :by_random, -> { where(featured: true).order("RANDOM()").limit(4) }
scope :by_cached_votes, ->{ order(:cached_votes_up => :desc).limit(4) }
scope :by_impression_count, ->{ order(:impressions_count => :desc).limit(4) }
scope :by_created_at, ->{ order("created_at DESC").limit(4) }
scope: all_conditions, -> { union_scope(by_random, by_cached_votes,by_impression_count,by_created_at}
你的控制器
@item = Item.all_conditions
您的看法:
- @loop.all_conditions.each do |item|
我的 haml 文档中有四个循环用于测试目的,唯一的区别是元素的顺序。
我是否能够以某种方式将逻辑放入我的控制器中,并在我的 haml 文档中仅列出一次循环的整个 'insidyness'?
目前,我将所有内容都复制了 4 次,你知道,这感觉很糟糕。 :)
例如:
- @loop.where(featured: true).order("RANDOM()").limit(4).each do |item|
%li
%h1 This is an example
- @loop.order(:cached_votes_up => :desc).limit(4).each do |item|
%li
%h1 This is an example
- @loop.order(:impressions_count => :desc).limit(4).each do |item|
%li
%h1 This is an example
- @loop.order("created_at DESC").limit(4).each do |item|
%li
%h1 This is an example
控制器:
def index
@loop = Item.all
end
我想将我的 Haml 代码缩减为这样的代码,并将其余代码移至控制器中:
- @loop.each do |item|
%li
%h1 This is an example
预先感谢每个回答!
在 Item
模型中 class:
scope :featured_with_random_order_desc, ->(limit_value) { where(featured: true).order("RANDOM()").limit(limit_value) }
scope :by_cached_votes_order_desc, ->(limit_value) { order(:cached_votes_up => :desc).limit(limit_value) }
scope :by_impression_count_order_desc, ->(limit_value) { order(:impressions_count => :desc).limit(limit_value) }
scope :by_created_at_desc, ->(limit_value) { order("created_at DESC").limit(limit_value) }
您认为:
- @loop.featured_with_random_order_desc(4).each do |item|
%li
%h1 This is an example
- @loop.by_cached_votes_order_desc(4).each do |item|
%li
%h1 This is an example
- @loop.by_impression_count_order_desclimit(4).each do |item|
%li
%h1 This is an example
- @loop.by_created_at_desc.limit(4).each do |item|
%li
%h1 This is an example
您可以更进一步,为控制器中的每个循环创建变量:
def index
@loop_featured = Item.featured_with_random_order_desc(4)
@loop_cached_votes = Item.by_cached_votes_order_desc(4)
@loop_impression_counts = Item.by_impression_count_order_desclimit(4)
@loop_by_created = Item.by_created_at_desc(4)
end
并在视图中使用它们:
- @loop_featured.each do |item|
%li
%h1 This is an example
- @loop_cached_votes.each do |item|
%li
%h1 This is an example
- @loop_impression_counts.each do |item|
%li
%h1 This is an example
- @loop_by_created.each do |item|
%li
%h1 This is an example
您不能多次渲染视图,但您可以这样做。
def index
@loops = [
Item.where(featured: true).order("RANDOM()"),
Item.order(:cached_votes_up => :desc),
Item.order(:impressions_count => :desc),
Item.order("created_at DESC")
]
end
然后在模板中
- @loops.each do |loop|
- loop.limit(4).each do |item|
%li
%h1 This is an example
您可以使用 ActiveRecord
union_scope
#item.rb
include ActiveRecord::UnionScope
scope :by_random, -> { where(featured: true).order("RANDOM()").limit(4) }
scope :by_cached_votes, ->{ order(:cached_votes_up => :desc).limit(4) }
scope :by_impression_count, ->{ order(:impressions_count => :desc).limit(4) }
scope :by_created_at, ->{ order("created_at DESC").limit(4) }
scope: all_conditions, -> { union_scope(by_random, by_cached_votes,by_impression_count,by_created_at}
你的控制器
@item = Item.all_conditions
您的看法:
- @loop.all_conditions.each do |item|