我是Rails的新手,我正在尝试通过它们的一个属性来过滤我数据库中的动物。我读到过,我可以通过控制器中的一个作用域,并通过URL上的一个参数来访问它,但我认为这对我不起作用,因为我使用循环来创建HTML。
有没有办法将过滤器添加到我正在使用的集合中(@animals)?
<% @animals.each do |animal| %>
<li>
<a href="#">
<%=link_to animal.ncommon, animal %>
</a>
</li>
<% end %>
我希望我的问题已经说清楚了。谢谢你的帮助!
发布于 2016-10-20 23:13:38
因此,最佳实践是将scope
移动到模型中,而不是控制器中。下面是一个例子。(请注意,这可能会根据您的文件结构和名称而变化)。
在这里,我将按类型过滤动物。假设类型1和类型2。
#model app/models/animal.rb
class Animal < ActiveRecord::Base
scope :by_type, -> (ty) { where(type: ty) }
end
#controller app/controllers/animals_controller.rb
class AnimalsController < ApplicationController
... other code
def index
# calls the by_type method/scope in the Animal model
# filter the records and assignes them to @animals varaible
@animals = Animal.by_type(params[:type])
end
... other code
end
然后你可以在视图中使用你的循环。当您想要过滤时,可以使用一个参数调用索引操作
例如http://localhost:3000/animals?type=1
因此,我们的想法不是在循环内部进行过滤,而是将过滤后的结果传递给@animals
变量。
发布于 2016-10-21 15:32:25
我刚刚找到了一个可以在循环中使用的解决方案。我改变了:
<% @animals.each do |animal| %>
至:
<% @animals.where("promo > ?", 0).each do |animal| %>
在这里,我得到了所有的动物,其促销大于零。
谢谢!
https://stackoverflow.com/questions/40165722
复制相似问题