2015-07-13 4 views
0

Я использую friendly_id 5.1.0, и когда я пытаюсь обновить запись, например, создав новую статью, вместо обновления данных записи она создаст новую. я ударил титул, и когда я не изменить при редактировании статьи, он создает слизняк с кучей цифр/букв:friendly_id создает новую запись в UPDATE

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. Вот мой articles_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

+0

Попробуйте использовать title_changed? в вашем методе should_generate_new_friendly_id –

+0

Не работает: «(Даже незнакомец: без« new_record? »он по-прежнему создает сетку при создании новой статьи. – TheDoctor

+0

Он всегда будет создавать пул на new_record. –

ответ

1

Этот вопрос не имеет ничего общего с FriendlyID.

Ваша проблема here (форма используется на обоих 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.

0

Разрешение id в Params

params.require(:article).permit(:id, :title, :text) 

Надежда, что помогает!

+0

Nope :(все еще создает новую запись Возможно, я мог бы сказать, что рельсы удаляют предыдущую запись, вызывая запрос DELETE? – TheDoctor

+0

Это распространенная ошибка при использовании вложенных форм, да.Забудьте параметр «id» и 'accepts_nested_attributes' рассматривает как новую запись. Но дело не в этом. –

0

Редактировать форму маршрутизирует, чтобы создать действие для контроллера статей вместо действия обновления. При редактировании файлов вам нужно изменить свой путь формы.

Если вы видите действие индекса статьи, вы можете увидеть новые статьи добавляются, вместо обновления