Javascript RubyonRails-视图中针对相同数据的两个不同过滤器
在主页上,我有一个视频和图片列表。这些视频和图片属于一个类别。因此,我有一个类别过滤器和一个类型过滤器(视频或图片)。问题是我不能在不改变第一个过滤器的情况下同时使用两个过滤器。例如,如果我只想显示图片,然后我想要一个特定的类别,我会从所选类别中获取所有图片和视频Javascript RubyonRails-视图中针对相同数据的两个不同过滤器,javascript,ruby-on-rails,ruby,view,filter,Javascript,Ruby On Rails,Ruby,View,Filter,在主页上,我有一个视频和图片列表。这些视频和图片属于一个类别。因此,我有一个类别过滤器和一个类型过滤器(视频或图片)。问题是我不能在不改变第一个过滤器的情况下同时使用两个过滤器。例如,如果我只想显示图片,然后我想要一个特定的类别,我会从所选类别中获取所有图片和视频图片过滤器示例:查看/galeries/index.html.erb <%= link_to show_pictures_path, :remote => true, :id => "btn-pictures", :c
图片过滤器示例:
查看/galeries/index.html.erb
<%= link_to show_pictures_path, :remote => true, :id => "btn-pictures", :class => "btn btn-default" do %>
<em class="glyphicon glyphicon-picture"></em> Pictures
<% end %>
<% @categories.each do |c| %>
<li class="" id=btn-filter<%=c.id%>>
<%= link_to show_categories_path(:id => c.id), :remote => true do %>
<span class="badge pull-right"><%= Media.joins(:pictures).where(category_id: c.id).count + Media.joins(:videos).where(category_id: c.id).count %></span> <%= c.name %>
<% end %>
</li>
<% end %>
查看/galeries/show_pictures.js.erb
$("#media_filter").html("<%= escape_javascript(render partial: 'partials/media_filter', locals: { medias: @selected } ) %>");
查看/galeries/show_categories.js.erb
$("#media_filter").html("<%= escape_javascript(render partial: 'partials/media_filter', locals: { medias: @videos} ) %>");
$("#media_filter").append("<%= escape_javascript(render partial: 'partials/media_filter', locals: { medias: @pictures } ) %>");
$(“#媒体过滤器”).html(“”);
$(“#媒体过滤器”)。附加(“”);
现在,您只需要传递类似于复选框的内容即可启用内容
现在,如果您已经创建了搜索表单标签,您只需传递一些类似于复选框的内容即可启用内容 只需为每种类型添加切换表单/复选框,然后在控制器中添加条件
def show_categories
@pictures = Picture.joins(:media).where("medium.category_id = ?", params[:category]) if params[:picture]=='true'
@videos = Video.joins(:media).where("medium.category_id = ?", params[:category]) if params[:video]=='true'
end
我希望url是这样的
yourhostname/yourmodels?utf8=✓&picture=boolean&video=boolean&category=integer
如果您已创建搜索表单标签 只需为每种类型添加切换表单/复选框,然后在控制器中添加条件
def show_categories
@pictures = Picture.joins(:media).where("medium.category_id = ?", params[:category]) if params[:picture]=='true'
@videos = Video.joins(:media).where("medium.category_id = ?", params[:category]) if params[:video]=='true'
end
我希望url是这样的
yourhostname/yourmodels?utf8=✓&picture=boolean&video=boolean&category=integer
如果我理解正确,问题似乎是你的应用程序不记得以前过滤器的值 您可以通过将所选筛选器作为参数发送并将其添加到链接来模拟此操作,以便下一个请求将获得上一个筛选器的值(如果有) 无需使用单独的操作,只需在控制器中执行一个操作即可应用过滤器(在我的示例中,我使用了
show_media
),您只需检查params
即可显示正确的信息
# controller/galeries_controller.rb
def show_media
@category = params[:category]
@type = params[:type]
@pictures = media(Picture) if @type == "pictures"
@videos = media(Video) if @type == "videos"
end
private
def media(model)
if @category.blank?
model.order('created_at DESC')
else
model.joins(:media).where("medium.category_id = ?", params[:id])
end
end
这里您正在设置@pictues
或@videos
的值,但您不需要使用两个操作,只需检查类型来设置其中一个
方法media
接收要使用的模型对象(Video
或Picture
),并返回相关的模型记录,具体取决于是否提供了category
(这有助于您稍微干燥代码)
接下来,您必须更新链接以同时包含type
和category
,这需要在index.html.erb
和show_media.js.erb
中完成:
# index.html.erb
<%= link_to show_media_path(type: "pictures"), remote: true, id: "btn-pictures", class: "btn btn-default" do %>
<em class="glyphicon glyphicon-picture"></em> Pictures
<% end %>
<%= link_to show_media_path(type: "videos"), remote: true, id: "btn-videos", class: "btn btn-default" do %>
<em class="glyphicon glyphicon-video"></em> Videos
<% end %>
<% @categories.each do |c| %>
<li class="" id="btn-filter<%= c.id %>">
<%= link_to show_categories_path(id: c.id), remote: true, "data-category-id": c.id, class: "category-id" do %>
<span class="badge pull-right"><%= Media.joins(:pictures).where(category_id: c.id).count + Media.joins(:videos).where(category_id: c.id).count %></span> <%= c.name %>
<% end %>
</li>
<% end %>
添加的行将使用在控制器中创建的@category
和@type
变量,根据您之前的请求,修改您的链接,以包括类型
和类别
参数
现在,无论您先单击什么,您都会将正确选择的筛选器传递给控制器,而不会每次都丢失它们。如果我理解正确,问题似乎是您的应用程序不记得以前筛选器的值
您可以通过将所选筛选器作为参数发送并将其添加到链接来模拟此操作,以便下一个请求将获得上一个筛选器的值(如果有)
无需使用单独的操作,只需在控制器中执行一个操作即可应用过滤器(在我的示例中,我使用了show_media
),您只需检查params
即可显示正确的信息
# controller/galeries_controller.rb
def show_media
@category = params[:category]
@type = params[:type]
@pictures = media(Picture) if @type == "pictures"
@videos = media(Video) if @type == "videos"
end
private
def media(model)
if @category.blank?
model.order('created_at DESC')
else
model.joins(:media).where("medium.category_id = ?", params[:id])
end
end
这里您正在设置@pictues
或@videos
的值,但您不需要使用两个操作,只需检查类型来设置其中一个
方法media
接收要使用的模型对象(Video
或Picture
),并返回相关的模型记录,具体取决于是否提供了category
(这有助于您稍微干燥代码)
接下来,您必须更新链接以同时包含type
和category
,这需要在index.html.erb
和show_media.js.erb
中完成:
# index.html.erb
<%= link_to show_media_path(type: "pictures"), remote: true, id: "btn-pictures", class: "btn btn-default" do %>
<em class="glyphicon glyphicon-picture"></em> Pictures
<% end %>
<%= link_to show_media_path(type: "videos"), remote: true, id: "btn-videos", class: "btn btn-default" do %>
<em class="glyphicon glyphicon-video"></em> Videos
<% end %>
<% @categories.each do |c| %>
<li class="" id="btn-filter<%= c.id %>">
<%= link_to show_categories_path(id: c.id), remote: true, "data-category-id": c.id, class: "category-id" do %>
<span class="badge pull-right"><%= Media.joins(:pictures).where(category_id: c.id).count + Media.joins(:videos).where(category_id: c.id).count %></span> <%= c.name %>
<% end %>
</li>
<% end %>
添加的行将使用在控制器中创建的@category
和@type
变量,根据您之前的请求,修改您的链接,以包括类型
和类别
参数
现在,无论您先单击什么,您都将始终将正确选择的筛选器传递给控制器,而不会每次丢失它们。您可以使用两个选择标记,一个用于类别,一个用于类型,而searchCategory筛选器的提交按钮也是一个链接?一次应用一个过滤器?如果您共享完整的代码(即,对于两个筛选器,而不仅仅是一个筛选器),则会有所帮助。是的,这是两个链接,它们不会同时应用。类别过滤器与此类似。您可以使用两个选择标记,一个用于类别,一个用于类型,searchCategory过滤器的提交按钮也是一个链接?一次应用一个过滤器?如果您共享完整的代码(即,对于两个筛选器,而不仅仅是一个筛选器),则会有所帮助。是的,这是两个链接,它们不会同时应用。类别的过滤器与此类似。哥们,你的姓氏很棒。只是因为这个原因,投票被提升了-)好吧,但这里不是一个开玩笑的网站@marmeladze,人们想要解决。我不是在开玩笑。你的答案会奏效,但不是一个好的解决方案。我刚刚投了你的姓。啊,好的,是的,这是一个丑陋的解决方案这是…==没错,伙计,你的姓真不错。只是因为这个原因,投票被提升了-)好吧,但这里不是一个开玩笑的网站@marmeladze,人们想要解决。我不是在开玩笑。你的答案会奏效,但不是一个好的解决方案。我刚刚投了你的姓。啊,好的,是的,这是一个丑陋的解决方案这是…==true
多余。因此,使用此解决方案,我需要将链接到替换为复选框?@KingofAbu您仍然可以使用链接到/按钮,但不要忘记将参数发送给控制器查看此参数[:video]
,参数[:picture]
因此,使用此解决方案,我需要将链接到替换为复选框