0

我是 ruby​​ on rails(和编程)的新手,这可能是一个非常愚蠢的问题。我正在使用 Rails 3.2 并尝试使用acts_as_taggable_on 在文章上生成标签,并将这些标签显示在文章索引上并将页面显示为可点击的链接。

我在文章显示和索引页面上都有可点击的标签,但链接只是返回到索引页面并且不根据标签名称进行排序。我已经在互联网上搜索并从各种来源拼凑了下面的代码,但我显然遗漏了一些东西。

非常感谢任何帮助,因为我已经用尽了我看似有限的知识!谢谢。

这是我所拥有的:

class ArticlesController < ApplicationController
    def tagged
        @articles = Article.all(:order => 'created_at DESC')
        @tags = Article.tag_counts_on(:tags)
        @tagged_articles = Article.tagged_with(params[:tags])  
        respond_to do |format|
          format.html # index.html.erb
          format.json { render :json => @articles }
        end 
      end

     def index
        @articles = Article.paginate :page => params[:page], :per_page => 3    
        @tags = Article.tag_counts_on(:tags)
        respond_to do |format|
          format.html # index.html.erb
          format.json { render json: @articles }
        end
      end

module ArticlesHelper
  include ActsAsTaggableOn::TagsHelper
end

class Article < ActiveRecord::Base
  acts_as_ordered_taggable
  acts_as_ordered_taggable_on :tags, :location, :about 
  attr_accessible :tag_list
  scope :by_join_date, order("created_at DESC")
end

article/index.html.erb
<% tag_cloud(@tags, %w(tag1 tag2 tag3 tag4)) do |tag| %>
<%= link_to tag.name, articles_path(:id => tag.name) %>
<% end %>

article/show.html.erb
<%= raw @article.tags.map { |tag| link_to tag.name, articles_path(:tag_id => tag) }.join(" | ") %>

routes.rb 文件片段

  authenticated :user do
    root :to => 'home#index'
  end

  devise_for :users
    resources :users, :only => [:show, :index]

  resources :images
  resources :articles
4

1 回答 1

0

您可以从终端运行“rake routes”以查看所有路径。在这里,您的标签指向articles_path,您将在articles 控制器中看到指向index 操作的路由(“articles#index”)

您可以在您的 routes.rb 文件中创建另一条路线,例如:

match 'articles/tags' => 'articles#tagged', :as => :tagged

如果您希望它优先,请将其放在路由文件中的其他文件之上,并记住您始终可以在终端中运行“rake routes”以查看路由的解释方式。

请参阅http://guides.rubyonrails.org/routing.html#naming-routes了解更多信息(也许阅读全文)

另一个(可能更好)选项是使用参数将您想要的功能组合到索引操作中,例如.../articles?tagged=true。然后,您可以使用逻辑在基于 params[:tagged] 的索引控制器中定义 @articles 变量。一个简单的例子可能是

 def index
    if params[:tagged]
      @articles = Article.all(:order => 'created_at DESC')
    else
      Article.paginate :page => params[:page], :per_page => 3
    end

    @tags = Article.tag_counts_on(:tags)
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @articles }
    end
  end

这被称为 DRYing up your code (for Don't Repeat Yourself);它将节省您在文章#tagged 操作中重复代码的需要,这将使您更容易理解和维护您的代码库。

希望有帮助。

于 2012-07-11T06:14:55.253 回答