在tags / show.html.erb中显示post_tag_links

嗨,我正在使用rails中的acts_as_taggable_on制作公告板系统。

我有问题,如何在tags / show.html.erb中显示post_tag_links。

我的代码如下

tags_controller.rb

def show @tag=ActsAsTaggableOn::Tag.find_by(name: params[:name]) @posts = Post.tagged_with(@tag.name) end 

标签show.html.erb

 

post.rb

  acts_as_taggable_on :tags acts_as_taggable after_validation :save_tags def save_tags array = self.check_taggable_word(self.title) self.tag_list.add(array, parse: true) end def tag_lists tag_lists = self.tag_list end def check_taggable_word(text) ary = Array.new nm = Natto::MeCab.new nm.parse(text) do |n| ary<<n.surface end tags = ActsAsTaggableOn::Tag.pluck(:name) return ary & tags end 

的routes.rb

 Rails.application.routes.draw do root 'static_pages#home' get '/about' => 'static_pages#about' get '/contact' => 'static_pages#contact' resources :categories do resources :posts end resources :posts do resources :comments resources :tags end get 'tags/:name' => 'tags#show' resources :tags, only: [:index, :show] end 

其他信息posts_controller.rb

 def create category_id = params[:post][:category_id] if category_id.present? && Category.find_by(id: category_id) @category = Category.find_by(id: category_id) else @post = Post.new( :title => params[:post][:title], :name => params[:post][:name] ) @post.valid? render :action => "new" and return end @post = Post.post_create(post_params) @post.ip = request.remote_ip if @post.name.present? else @post.name = “no-name” end respond_to do |format| if @post.save format.html { redirect_to @post, notice: 'done' } format.json { render :show, status: :created, location: @post } else format.html { render :new } format.json { render json: @post.errors, status: :unprocessable_entity } end end 

结束

实施Act-as-taggable-on

https://github.com/mbleigh/acts-as-taggable-on#tag-cloud-calculations

包含在post.rb模型或user.rb模型中

 class Post acts_as_taggable_on :tags end 

posts_controlleruser_controller包含以下强参数

 class PostsController < ApplicationController def user_params params.require(:posts).permit(:tag_list) ## Rails 4 strong params usage end end 

通过创建标签来确保一切正常的重要测试。

 @post = Post.new 

为新的@post添加标签

 @post.tag_list.add("history") @post.tag_list.add("england") @post.save 

检查标签

 @post.tag_list @post.tags 

这应该是预期的输出,如果标签创建中存在一些问题,则需要停止并修复它。 如果此标记仅用于此@post,则标记计数应为1。

 => [#, #] 

实现标签云

您希望在post的显示页面上显示该post的标签链接列表重定向到单独的页面,该列表显示所有带有该标签的post。 可以使用tag_cloud实现此function

例如,在创建之前的@post的情况下。 @post的post#show将有2个标签“history,england”,如果我们选择“历史”链接,我们将被重定向到一个新页面,其中包含所有“历史”post的链接。

第一步是了解这将是posts_controllerposts#show posts_controller 。 在此操作中,我们需要实现以下代码。

 class PostsController < ApplicationController def show @tags = Post.tag_counts_on(:tags) end end 

知道你必须检查@tags是否已填满,所以在你的rails控制台中执行以下操作(我测试了它并返回以下内容)。 如果它是空的,它将无法工作。 @tags = Post.tag_counts_on(:标签)

 => [#, #, #, #] 

然后在您的视图posts / show.html.erb中,您将包含以下代码:此代码将在变量标记中循环@tags并创建指向我们将在同一控制器中使用action =>:tag配置的新屏幕的链接。

 <% @tags.each do |tag| %> <%= link_to tag.name, { :action => :tag, :id => tag.name } %> <% end %> 

现在您应该测试function是否有效,但可能会看到创建它所需的:标记操作,因此在posts_controller中创建标记操作。

 class PostsController < ApplicationController def tag @tag = ActsAsTaggableOn::Tag.find_by(name: params[:name]) @posts = Post.tagged_with(@tag.name) end end 

在控制台中测试它

 @tag = ActsAsTaggableOn::Tag.find_by(name: "javascript") => # 

然后在视图中,您需要显示这些post。

 <%= @tag.name %> <% @posts.each do |post| %> <%= post.name %> <%= post.desctiption %> <%= etc... %> <% end %> 

然后配置路由,例如,如果您在routes.rb资源:posts`中,show动作应该不是问题,但您应该配置:tag动作。

获取posts/:id/tag =>'posts#tag'`

我们应该对这个讨论进行一些编辑。 我们写了太多评论,因此如果您愿意,可以删除它们,如果出现一些错误消息,您可以写一条新评论。 此外,如果您有任何问题,最好的方法是编辑您的问题并进行解释。

我没有再使用以下视图,但您也可以尝试使用此视图,但我不知道tag_cloud标记是什么。 我认为它包含在模块ActsAsTaggableOn :: TagsHelper中

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

这是模块

 module PostsHelper include ActsAsTaggableOn::TagsHelper end