Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RubyonRails-视图中针对相同数据的两个不同过滤器_Javascript_Ruby On Rails_Ruby_View_Filter - Fatal编程技术网

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]
因此,使用此解决方案,我需要将链接到替换为复选框