Rails подсчитывает статьи по тегам и связанные статьи по тегам

Привет, ребята, я новичок в рельсах и пытаюсь сделать то, чего никогда раньше не делал. Во-первых, теперь у меня есть Rails с драгоценными камнями act_as_taggable, но я попробовал это, и у меня не сработало, возможно, мне нужно узнать, как его установить (уже уже установил act_as_votable).

Итак, это мой вопрос, я хочу показывать связанные статьи (с тегом) для каждой статьи. А также хочу поместить article.count по тегу в свой ярлык.

ст.рб

class Article < ApplicationRecord
acts_as_votable

belongs_to :category
belongs_to :user

has_many :taggings
has_many :tags, through: :taggings


def tag_list
    self.tags.collect do |tag|
        tag.name
    end.join(", ")
end

def tag_list=(tags_string)
    tag_names = tags_string.split(",").collect{|s| s.strip.downcase}.uniq
new_or_found_tags = tag_names.collect { |name| Tag.find_or_create_by(name: name) }
self.tags = new_or_found_tags
end



has_attached_file :image, styles: { front: "400x500>" ,medium: "700x500>", small: "350x250>" }
validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/
end

тег.rb

class Tag < ApplicationRecord
has_many :taggings
has_many :articles, through: :taggings


def to_s
  name
end
end

тегирование.rb

class Tagging < ApplicationRecord
belongs_to :article
belongs_to :tag
end

article_controller.rb

class ArticlesController < ApplicationController

before_action :find_article, only: [:show, :edit, :update, :destroy, :upvote, :downvote]
before_action :authenticate_user!, except: [:show, :index]

def index
if params[:category].blank?
  @articles = Article.page(params[:page]).per(10).order('created_at DESC')
else
  @category_id = Category.find_by(name: params[:category]).id
  @articles = Article.where(category_id: @category_id).order("created_at   DESC")
end
    @tags = Tag.all
end

def show
    # if params[:tag]
    #   @articles = Article.tagged_with(params[:tag])
    #   @tag = @articles
    # end
end

def new
@article = current_user.articles.build
end

def create
@article = current_user.articles.build(article_params)

if @article.save
    redirect_to @article
else
    render 'new'
end
end

def edit
end

def update
if @article.update(article_params)
    redirect_to @article
else
    render 'edit'
end
end

def destroy
@artice.destroy

redirect_to root_path
end

def upvote
@article.upvote_by current_user
redirect_to :back
end

def downvote
@article.downvote_by current_user
redirect_to :back
end




private

def find_article
@article = Article.find(params[:id])
end

def article_params
params.require(:article).permit(:title, :content, :category_id, :image, :tag_list)
end
end

tags_controller.rb

class TagsController < ApplicationController

def show
@tag = Tag.find(params[:id])
end
end

И это страница шоу, на которой вы хотите показать связанные статьи.

статьи/show.html.haml

.container
.row
    .col-md-8.col-offset-2
        %h1= @article.title
        = image_tag @article.image.url(:medium)
        %br/
        - @article.tags.each do |tag|
            %h4
                %strong
                    %span.label.label-danger
                        %i.fa.fa-tag
                            = link_to tag.name, tag
                            = tag.name.count
        .pull-right
            - if @article.user == current_user
                .btn-group
                    = link_to 'Edit', edit_article_path, class: "btn btn-default"
                    = link_to 'Delete', article_path, method: :delete, data: {confirm: 'Are you sure ?'}, class: 'btn btn-danger'
        %hr/
        %p
            %i.fa.fa-pencil
                %[email protected]
                %button.btn.btn-primary
                    %i.fa.fa-hand-o-left
                        Follow
        %p
            %i.fa.fa-clock-o
                %em= time_ago_in_words(@article.created_at) + ' ago'
        %hr/
        %p= simple_format(@article.content)
        .row
            .col-md-4
                = link_to like_article_path(@article), method: :get, class: 'btn btn-primary data' do
                    %i.fa.fa-thumbs-o-up
                    = @article.get_upvotes.size
                = link_to dislike_article_path(@article), method: :get, class: 'btn btn-danger data' do
                    %i.fa.fa-thumbs-o-down
                    = @article.get_downvotes.size
            .col-md-6.pull-right
                %h3 Share this Article
                = social_share_button_tag
        %hr/
        = render 'layouts/disqus'
    -# .col-md-3.col-md-offset-1
    -#  %h2.text-center Articles Related
    -#  %hr/
    -#  - if @article(params[:tag])
    -#      - @tag.articles.each do |article|
    -#          .thumbnail
    -#              = link_to image_tag(article.image.url(:small)), article
    -#              .caption
    -#                  %h3.text-center= @article.title
    -#                  = link_to 'Read', @article, class: "btn btn-danger"
    -#                  .pull-right
    -#                      %span.badge.upvote
    -#                          %i.fa.fa-thumbs-o-up
    -#                              = @article.get_upvotes.size
    -#                      %span.badge.downvote
    -#                          %i.fa.fa-thumbs-o-down
    -#                              = @article.get_downvotes.size

person EQuimper    schedule 23.02.2016    source источник
comment
Более минимальный пример, демонстрирующий проблему, был бы действительно хорошей идеей. Это тонна кода для просмотра.   -  person tadman    schedule 24.02.2016
comment
неопределенный метод `статьи' для nil:NilClass   -  person EQuimper    schedule 24.02.2016
comment
Я пробовал все, что знаю, но ничего хорошего не получалось, читал и т. д.   -  person EQuimper    schedule 24.02.2016
comment
Здесь еще многое предстоит раскопать. Я правильно понимаю, что вы просто хотите отобразить теги, которые есть у каждой статьи?   -  person tadman    schedule 24.02.2016
comment
Это уже сделано хочу я хочу это две вещи. Во-первых, нужно получить article.count для каждого тега, чтобы пользователь мог видеть имя тега и количество статей с этим тегом. Во-вторых, я хочу показать связанную статью на странице отображения статьи, и я хочу сделать это с помощью тега, как если бы в этой статье отображался хотя бы один одинаковый тег.   -  person EQuimper    schedule 24.02.2016


Ответы (1)


Вы должны изучить действия, которые могут быть помечены. Существует множество руководств по его использованию. Я попробовал это, и это сработало хорошо. введите здесь описание ссылки

Если вы хотите настроить свои собственные таблицы тегов, вам следует изучить отношения «многие ко многим»: введите здесь описание ссылки

Если вы пытаетесь отобразить связанные статьи для каждой статьи и количества, и вы все правильно настроили, это должно быть так просто:

(буду писать на эрбе)

<% @articles.each do |article| %>
  <%= article.title %>
  <% article.tags.each do |tag| %>
    Tag: <%= tag.to_s + "Related count: (#{tag.articles.count})" %>
    Related articles:
    <% tag.articles.each do |related_article| %>
      <%= related_article.title %>
    <% end %>
  <% end %>
<% end %>
person Vincent    schedule 23.02.2016
comment
Спасибо за ссылку об ассоциации - person EQuimper; 24.02.2016
comment
А вот для act_as_taggable не знаю почему но у меня все время ошибка - person EQuimper; 24.02.2016