Можно ли предотвратить пустые текстовые записи действий

У меня очень простая текстовая модель действия и форма

class Course < ApplicationRecord 
  validates :title, presence: true
  has_rich_text :content
end

<%= form_with model: @course do |f| %>
  <%= f.text_field :title %>
  <%= f.rich_text_area :content %>
<% end %>

Все работает отлично, но, поскольку поле content является необязательным, можно ли создать course модель без создания action_text_rich_texts пустых / пустых записей? Даже если пользователь вводит только title без каких-либо content, он в настоящее время создает их, а в базе данных много ненужных и пустых action_text_rich_texts строк.


person vince    schedule 28.10.2020    source источник


Ответы (2)


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

Первое, что я хотел бы попробовать, - это проверить, не установит ли что-либо в content, чтобы Rails не создавал связанную запись:

class CourseController
  def create
    # remove course_params[:content] if it's blank
    course_values = course_params[:content].blank? ? course_params.except(:content) : course_params

    Course.create(course_values)
    ...
  end
end
person Chiperific    schedule 29.10.2020
comment
это работает при создании курса без содержимого, но если в курсе уже был контент и он стирается при обновлении, он не стирает содержимое - person vince; 29.10.2020

В своем приложении я справился с этим с помощью обратного вызова before_save, который удаляет запись базы данных ActionText::RichText, если body пусто.

Это позволяет избежать загрязнения контроллера и работает как с действиями создания, так и с обновлением. Атрибут body атрибута action_text по-прежнему доступен даже без соответствующей записи в базе данных, потому что ActionText создаст экземпляр нового объекта, если запись не может быть найдена (что позволяет вам проверить blank? в любом сценарии).

Попробуй это:

class Course < ApplicationRecord 
  validates :title, presence: true
  has_rich_text :content
  before_save :clean_up_content

  private

  def clean_up_content
    self.content.destroy if self.content.body.blank?
  end
end
person Eric Powell    schedule 13.11.2020