friendly_id создает новую запись в UPDATE
Я использую friendly_id 5.1.0, и когда я пытаюсь обновить запись, например, для создания новой статьи, вместо обновления данных записи, она создает новую. Я добавил заголовок, и когда я не изменяю его при редактировании статьи, он создает фрагмент с набором цифр / букв:
http://localhost:3000/articles/first-article-2d392b8e-92b8-44b0-ad67-50dd674f7aaa
Вот моя модель article.rb:
class Article < ActiveRecord::Base
extend FriendlyId
has_many :comments
friendly_id :title, :use => :slugged
validates :title, presence: true,
length: { minimum: 5}
def should_generate_new_friendly_id?
new_record? || title_changed?
end
когда я добавлю :use => [:slugged, :history]
, когда я обновляю запись и сохраняю тот же заголовок, он не может сохранить ее, потому что мой :slug
поле unique :true
, Вот мой article_controller.rb:
class ArticlesController < ApplicationController
def index
@articles = Article.all.order(created_at: :desc)
end
def show
@article = Article.friendly.find(params[:id])
if request.path != article_path(@article)
redirect_to @article, status: :moved_permanently
end
end
def new
@article = Article.new
end
def edit
@article = Article.friendly.find(params[:id])
end
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article
else
render 'new'
end
end
def update
@article = Article.friendly.find(params[:id])
if @article.update(article_params)
redirect_to @article
else
render 'edit'
end
end
def destroy
@article = Article.friendly.find(params[:id])
@article.destroy
redirect_to articles_path
end
private
def article_params
params.require(:article).permit(:title, :text)
end
end
Вот мой репозиторий GitHub с моим (незаконченным) проектом: https://github.com/TheDoctor314/blog
3 ответа
Эта проблема не имеет ничего общего с FriendlyID.
Ваша проблема здесь (форма используется на обоих new
а также edit
):
<%= bootstrap_form_for :article, url: articles_path do |f| %>
Он не пытается использовать ваш @article
возразить, чтобы построить эту форму. Таким образом, ваша форма всегда выдает POST
запросить articles_path
что приводит к create
каждый раз. Что вы должны сделать вместо этого:
<%= bootstrap_form_for @article do |f| %>
Таким образом, конструктор форм будет проверять, является ли этот объект persisted?
уже, и если это так, создайте форму, которая выдает PATCH
запрос к этой конкретной статье, которая вызывает update
действие. Он попытается угадать URL самостоятельно. И это будет успешным, только если вы будете достаточно строго следовать соглашениям.
Если @article
не является persisted?
, он будет делать то, что сделал: сделать POST
в articles_path
,
Форма редактирования - это маршрутизация для создания действия для контроллера статей вместо действия обновления. Вам нужно изменить путь к форме при редактировании файлов.
Если вы видите действие индекса статей, вы можете видеть, что новые статьи добавляются вместо обновления
Разрешать id
в парамах
params.require(:article).permit(:id, :title, :text)
Надеюсь, это поможет!