您正在使用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
<h1><%= @tag.name %></h1><%= link_to "タグ一覧",tags_path %>
<div><%= render @posts %></div>
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
端
答案 0 :(得分:0)
https://github.com/mbleigh/acts-as-taggable-on#tag-cloud-calculations
包含在您的post.rb
模型或user.rb
模型中
class Post
acts_as_taggable_on :tags
end
在您的posts_controller
或user_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。
=> [#<ActsAsTaggableOn::Tag id: 1, name: "history", taggings_count: 1>,
#<ActsAsTaggableOn::Tag id: 2, name: "england", taggings_count: 1>]
您希望在帖子的展示页面上显示该帖子的标签链接列表,这些链接会重定向到单独的页面,该页面会显示包含该标签的所有帖子。可以使用tag_cloud
实现此功能例如,在创建之前的@post的情况下。 @post的帖子#show将有2个标签&#34; history,england,&#34 ;,如果我们选择&#34; history&#34;链接我们将被重定向到一个新页面,其中包含指向所有&#34;历史记录&#34;讯息。
第一步是了解这将在posts#show
的{{1}}行动中。在此操作中,我们需要实现以下代码。
posts_controller
知道你必须检查@tags是否已填满,所以在你的rails控制台中执行以下操作(我测试了它并返回以下内容)。如果它是空的,它将无法工作。 @tags = Post.tag_counts_on(:tags)
class PostsController < ApplicationController
def show
@tags = Post.tag_counts_on(:tags)
end
end
然后在您的视图posts / show.html.erb中,您将包含以下代码: 此代码将在变量标记中循环@tags并创建指向我们将使用action =&gt;配置的新屏幕的链接:标记在同一个控制器中。
=> [#<ActsAsTaggableOn::Tag:0x00000006bb85e0 id: 6, name: "javascript", taggings_count: 4>,
#<ActsAsTaggableOn::Tag:0x00000006bb84a0 id: 5, name: "html", taggings_count: 6>,
#<ActsAsTaggableOn::Tag:0x00000006bb8220 id: 18, name: "java", taggings_count: 1>,
#<ActsAsTaggableOn::Tag:0x00000006ba7ee8 id: 4, name: "css", taggings_count: 6>]
现在您应该测试功能是否有效,但可能会看到创建它所需的:标记操作,因此在posts_controller中创建标记操作。
<% @tags.each do |tag| %>
<%= link_to tag.name, { :action => :tag, :id => tag.name } %>
<% end %>
在控制台中测试
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")
=> #<ActsAsTaggableOn::Tag:0x000000069c1fc0 id: 6, name: "javascript", taggings_count: 4>
然后配置路由,例如,如果您有<%= @tag.name %>
<% @posts.each do |post| %>
<%= post.name %>
<%= post.desctiption %>
<%= etc... %>
<% end %>
资源:posts`,则show动作不应该是一个问题,但您应该配置:tag动作。
GET routes.rb
=&gt; &#39;#帖标签&#39;`
我们应该对这个讨论进行一些编辑。我们写了太多评论,因此如果您愿意,可以删除它们,如果出现一些错误消息,您可以写一条新评论。此外,如果您有任何问题,最好的方法是编辑您的问题并进行解释。
我没有再使用以下视图,但您也可以尝试使用此视图,但我不知道tag_cloud标记是什么。我认为它包含在模块ActsAsTaggableOn :: TagsHelper
中posts/:id/tag
这是模块
<% 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 %>