在tags / show.html.erb

时间:2017-03-12 07:48:16

标签: ruby-on-rails ruby

您正在使用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

1 个答案:

答案 0 :(得分:0)

实施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。

=> [#<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 %>