是否可以防止输入空的操作文本

问题描述

我有一个非常简单的动作文本模型和表格

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

解决方法

我不确定在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
,

我在应用程序中处理此问题的方式是使用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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...