Friendly_id, запрещающий редактирование / новые страницы из-за before_action: find_post - PullRequest
0 голосов
/ 12 марта 2019

Я использую гем friendly_id для обработки URL-слагов, и при применении исправления, чтобы избежать 404-х, когда слаг отличается от документации , мой код не работает должным образом.

проблема в том, что он просто перенаправляет в представление представления поста, когда я нажимаю на кнопку редактирования, и не позволяет мне создать новое сообщение, потому что он "не может найти сообщение с идентификатором ...", потому что использует метод find_post.

У меня есть таблица friendly_id_slugs для хранения истории.

В моей почтовой модели:

class Post < ApplicationRecord
  extend FriendlyId
  friendly_id :title, use: :slugged

  ...

  def should_generate_new_friendly_id?
    slug.nil? || title_changed?
  end
end

Почтовый контроллер:

class PostsController < ApplicationController
  before_action :find_post

  ...

  def find_post
    @post = Post.friendly.find(params[:id])

    # If an old id or a numeric id was used to find the record, then
    # the request path will not match the post_path, and we should do
    # a 301 redirect that uses the current friendly id.
    if request.path != post_path(@post)
      return redirect_to @post, :status => :moved_permanently
    end
  end
end

Я пытался использовать before_filter, но спрашивает меня, имею ли я в виду before_action, и я пытался использовать метод find_post как в общедоступной, так и в private секции моего контроллера.

1 Ответ

1 голос
/ 12 марта 2019

Мне кажется, что вы можете пропустить эту логику перенаправления для чего угодно, кроме действия show, поскольку redirect_to @post отправляет вас только на маршрут показа.

def find_post
  @post = Post.find params[:id]

  if action_name == 'show' && request.path != post_path(@post)
    return redirect_to @post, :status => :moved_permanently
  end
end

Кроме того, вы можете отделить поведение перенаправления от предварительной загрузки поста примерно так:

before_action :find_post
before_action :redirect_to_canonical_route, only: :show

def find_post
  @post = Post.find params[:id]
end

def redirect_to_canonical_route
  if request.path != post_path(@post)
    return redirect_to @post, :status => :moved_permanently
  end
end
...