Rails 5 предыдущий или следующий пост ТОЛЬКО от определенного тега

У меня есть ресурс с именем posts, которых много. Однако каждый пост может иметь несколько тегов. Я хочу, чтобы пользователи могли переходить к предыдущему и следующему посту ТОЛЬКО из выбранного тега. У меня это работает для всех постов из базы данных в предыдущем следующем, но когда я нажимаю на тег и он показывает все теги, prev /next не придерживается того, что это за тег.

Если я посещу URL-адрес в сочетании с кодом, определенным в rout.rb, get 'tags/:tag', to: 'posts#index', as: :tag, он перечислит все теги в индекс. Я не хочу этого, я хочу, чтобы пользователь мог нажимать предыдущий или следующий и делать это только на сообщениях, связанных с тегом.

Примечание. Я использую гем friendly_id

Контроллеры /posts_controller.rb

  def index
    @posts = Post.all

    if params[:tag]
      @posts = Post.tagged_with(params[:tag])
    else
      @posts = Post.all
    end

  end

модели /post.rb

# tags 
  acts_as_taggable # Alias for acts_as_taggable_on :tags

def next
    Post.where("id > ?", id).order(id: :asc).limit(1).first
end

def prev
     Post.where("id < ?", id).order(id: :desc).limit(1).first
end

show.html.erb

<%= link_to "← Previous Question", @post.prev, :class => 'button previous-question' %>

<%= link_to "Next Question →", @post.next, :class => 'button next-question' %>

routes.rb

 # TAGS
  get 'tags/:tag', to: 'posts#index', as: :tag
10 голосов | спросил mazing 13 +03002017-10-13T15:41:40+03:00312017bEurope/MoscowFri, 13 Oct 2017 15:41:40 +0300 2017, 15:41:40

2 ответа


0

Я думаю, вам придется обойти этот параметр tag (хотя вы, вероятно, должны сделать его вспомогательным методом)

модели /post.rb

def next tag
  Post.where("id > ?", id).tagged_with(tag).order(id: :asc).limit(1).first
end

def prev tag
  Post.where("id < ?", id).tagged_with(tag).order(id: :desc).limit(1).first
end

показать

<%= link_to "← Previous Question", post_path(@post.prev(current_tag).id, tag: current_tag), :class => 'button previous-question' %>

<%= link_to "Next Question →", post_path(@post.next(current_tag).id, tag: current_tag), :class => 'button next-question' %>

Контроллеры /posts_controller.rb

class PostsController < ApplicationController
  helper_method :current_tag

  #def show
  #def index

  private

  def current_tag
    params[:tag]
  end
end
ответил Sean 13 +03002017-10-13T20:41:13+03:00312017bEurope/MoscowFri, 13 Oct 2017 20:41:13 +0300 2017, 20:41:13
0

Вы также можете использовать подход с вложенными ресурсами и изменять маршруты следующим образом:

resource :tag do
  resource :post
end

Он должен дать вам структуру маршрутов, так что /tags/:tag_id/posts будет указывать на все сообщения для данного тега, а /tags/:tag_id/posts/:id будет указывать на точное сообщение (или вопрос?), Помеченное этим тегом.

Затем в контроллере постов вы должны добавить before_filter :set_tag вот так

before_filer :set_tag

def set_tag
  @tag = Tag.find(params[:tag_id])
end

действие index будет выглядеть так

 def index
    @posts = @tag.posts
 end

и всегда будет показывать сообщения для этого тега.

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

Вам также следует изменить все помощники по URL-адресам постов, используемые в представлениях, чтобы включить текущий тег, например, posts_path -> tag_posts_path(@tag) где тег - это текущий тег, который был установлен в before_filter.

Я настоятельно рекомендую не помещать все эти методы в модель и не создавать объект презентатора для сообщения, например.

class PostPresenter
  attr_reader :post
  alias_method :current, :post

  def initialize(post)
    @post = post
    @repo = post.class
  end

  def next
    @repo.where('id > ?', post.id).first
  end

  def previous
    @repo.where('id < ?', post.id).first
  end
end

и

@presenter = PostPresenter.new(@post)

и ссылка на следующий пост

<%= link_to "Next Question →", 
      tag_post_path(@presenter.next), 
      class: 'button next-question' if @presenter.next.present? %>
ответил Bogdan Agafonov 21 +03002017-10-21T15:53:46+03:00312017bEurope/MoscowSat, 21 Oct 2017 15:53:46 +0300 2017, 15:53:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132