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)

Надеюсь, это поможет!

Другие вопросы по тегам