1

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

这是我的控制器

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>

我对如何以与循环播放用户发布的视频相同的方式显示用户投票的视频感到困惑?

4

3 回答 3

0

您需要使用@votes而不是votes单独使用。该@符号与视图层共享变量,以便您可以使用它执行操作(例如循环它)。

于 2013-10-20T07:04:38.947 回答
0

instance variable关于和local variable在rails中有一个概念。

每当您使用@符号定义变量时,该特定变量是实例变量并且可以通过其viewspartials.

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

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

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

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

于 2013-10-20T12:04:52.160 回答
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。将此文件(使用上面的代码)存储在与其他视图文件相同的目录中

例如

<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>
于 2013-10-20T12:12:20.157 回答