同一个展示页面上有多个循环

时间:2013-10-20 06:44:58

标签: ruby-on-rails loops

我有一个页面显示他发布的用户视频,并且在同一页面上显示了他投票的用户视频。

这是我的控制器

class UsersController < ApplicationController
 def show
   @user = User.find(params[:id])
   @videos = @user.videos.order("created_at desc").page(params[:page]).per_page(12)
    votes = @user.videos_with_votes("created_at desc").page(params[:page]).per_page(12)
 end
end

以下是我的展示页面的视图

<div id="videos">
  <% @videos.each do |video| %>
    <div class="box">
  <%= image_tag video.image.url(:threeacross) %>
  <%= video.title %>
      <%= video.description %>
  <%= video.user_id %>
  <%= link_to 'Show', video %>
  <%= link_to 'Edit', edit_video_path(video) %>
    </div>
  <% end %>
</div>

我对如何显示用户投票的视频感到困惑,就像我循环发布的用户视频一样?

3 个答案:

答案 0 :(得分:0)

您需要使用@votes代替votes@符号与视图层共享变量,以便您可以使用它(例如循环遍历它)。

答案 1 :(得分:0)

在rails中有一个关于instance variablelocal variable的概念。

每当您使用@符号定义变量时,特定变量是一个实例变量,并且可以通过其viewspartials访问。

例如:@videos = @ user.videos.order(“created_at desc”)。page(params [:page])。per_page(12)

此处@videos是一个实例变量,并在其范围内保留其实例。

local变量的范围仅限于其循环/边界。局部变量最好用在循环中,其中循环执行后变量是Garbage Collected,我们可以再次使用相同的变量名来存储不同的值。

在您的情况下,votes在您的视图中无法作为局部变量访问,因此要在视图中使用此变量,您需要将此变量定义为实例变量(如@votes)。

答案 2 :(得分:0)

使用实例变量,例如

class UsersController < ApplicationController
 def show
   @user = User.find(params[:id])
   @videos = @user.videos.order("created_at desc").page(params[:page]).per_page(12)
   @voted_videos = @user.videos_with_votes("created_at desc").page(params[:page]).per_page(12)
 end
end

<div id="voted_videos">
  <% @voted_videos.each do |video| %>
    <div class="box">
      <%= image_tag video.image.url(:threeacross) %>
      <%= video.title %>
      <%= video.description %>
      <%= video.user_id %>
      <%= link_to 'Show', video %>
      <%= link_to 'Edit', edit_video_path(video) %>
    </div>
  <% end %>
</div>

如果视频和投票视频的显示与制作此代码的效果相同:

    <div class="box">
      <%= image_tag video.image.url(:threeacross) %>
      <%= video.title %>
      <%= video.description %>
      <%= video.user_id %>
      <%= link_to 'Show', video %>
      <%= link_to 'Edit', edit_video_path(video) %>
    </div>

部分名为_videos.html.erb,可用于@videos@voted_videos。 将此文件(包含上述代码)存储在与其他视图文件相同的目录中

e.g。

<div id="voted_videos">
  <% @videos.each do |video| %>
    <% render "videos" %>
  <% end %>
</div>


<div id="voted_videos">
  <% @voted_videos.each do |video| %>
    <% render "videos" %>
  <% end %>
</div>