1

我对 Ruby on Rails 很陌生,所以我可能缺少一个简单的解决方案。

tldr 版本 - 如何在该模型的索引页面上显示分配给特定模型的所有实例的不同(即不重复)标签的标签云上的 Acts As Taggable On 标签云?

更长的版本 - 我有一个名为 Video 的模型,在该模型中,我成功地使用Acts as Taggable On这个精彩的教程实现了一个标记功能。

我现在想做的是,在视频的索引页面 (index.html.erb) 上,显示用户分配给单个视频的所有单个标签的摘要。例如,假设我有三个视频,每个视频标记如下:

Video 1: great, banana, book
Video 2: small, great, apple
Video 3: rubbish, small, banana

我希望索引页面显示以下标签列表:

great, banana, book, small, apple, rubbish.

我的模型(省略)的代码如下:

class Video < ActiveRecord::Base

attr_accessible :tag_list # Lots of other fields in here as well, but not relevant

acts_as_taggable_on :tags

end

我的视频助手中的代码如下:

module VideosHelper

  include ActsAsTaggableOn::TagsHelper

end

最后,根据 gem 的文档,我在控制器中添加了以下代码:

class VideosController < ApplicationController
  def tag_cloud
    @tags = Video.tag_counts_on(:tags)
  end
end

那么,我应该在视图的索引页面中添加什么代码?根据文档,我再次尝试了以下操作:

<% tag_cloud(@tags, %w(css1 css2 css3 css4)) do |tag, css_class| %>
  <%= link_to tag.name, { :action => :tag, :id => tag.name }, :class => css_class %>
<% end %>

但是当我转到视频索引页面时,这会返回以下错误:

undefined method `empty?' for nil:NilClass

正如我所说,我显然遗漏了一些简单的东西,但我对 Rails(和 Ruby)完全陌生,所以我仍在寻找自己的脚。

4

1 回答 1

3

好的,经过一番破解,我我已经找到了解决方案,以防其他想知道如何做到这一点的人偶然发现这个问题。

但是,请注意,我是 RoR 的初学者,所以这可能不是最好的解决方案 - 如果我做错了什么,或者您有更好的解决方案,请随时告诉我!

在您的视图中添加此代码以按顺序显示特定模型的标签列表:

@tags = ActsAsTaggableOn::Tag.all(:order=>'name')

<% if @tags.count > 0 %>
  <ul>
    <% @tags.each do |tag| %>
      <li><%= link_to tag.name, tagged_url(:tag => tag.name) %></li>
    <% end %>
  </ul>
<% else %>
  <p>There are no tags on the system.</p>
<% end %>

这导致了一个非常基本的显示,由于我缺乏经验,我建议谨慎使用这种方法 - 我确信它不是最好的,甚至不是“最安全”的方法,所以要小心!

于 2012-08-16T11:27:29.603 回答