简单的表单错误:Mysql::Error: Column 'cached_slug'

Posted

技术标签:

【中文标题】简单的表单错误:Mysql::Error: Column \'cached_slug\'【英文标题】:Simple form error: Mysql::Error: Column 'cached_slug'简单的表单错误:Mysql::Error: Column 'cached_slug' 【发布时间】:2011-07-07 07:59:49 【问题描述】:

我在提交分类表单时收到此错误:

KategorisController#create 中的 ActiveRecord::StatementInvalid

mysql::Error: 列 'cached_slug' 不能为空:INSERT INTO kategoris

这是我的表格:

<%= simple_form_for(@kategori) do |f| %>

    <%= f.input :name %>
    <%= f.button :submit %>
<% end %>

这是我的控制器:

 # GET /kategoris/new.xml
  def new
    @kategori = Kategori.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml   render :xml => @kategori 
    end
  end

  # GET /kategoris/1/edit
  def edit
    @kategori = Kategori.find(params[:id])
  end

  # POST /kategoris

  # POST /kategoris.xml
  def create
    @kategori = Kategori.new(params[:kategori])

    respond_to do |format|
      if @kategori.save
        format.html  redirect_to(@kategori, :notice => 'Kategori was successfully created.') 
        format.xml   render :xml => @kategori, :status => :created, :location => @kategori 
      else
        format.html  render :action => "new" 
        format.xml   render :xml => @kategori.errors, :status => :unprocessable_entity 
      end
    end
  end

我应该将 ID 重命名为friendly_id 吗?

【问题讨论】:

【参考方案1】:

您似乎需要先在模型中填充 cached_slug 字段,然后才能保存它。通常你可以使用这样的模式:

class Kategori < ActiveRecord::Base
  before_save :assign_cached_slug, :unless => :cached_slug?

protected
  def assign_cached_slug
    self.cached_slug = self.title.gsub(/\s+/, '_').gsub(/[^\w\-]/, '')
  end
end

你可以使用任何你需要的slugification系统。这里给出的只是一个例子。

【讨论】:

【参考方案2】:

似乎数据库中的列 cached_slug 在数据库级别本身中不可为空。所以,错误正在发生。您可以使用 Tadman 的代码来摆脱这种情况。

【讨论】:

以上是关于简单的表单错误:Mysql::Error: Column 'cached_slug'的主要内容,如果未能解决你的问题,请参考以下文章

错误对齐的引导程序表单元素

ActiveRecord::StatementInvalid: Mysql2::Error: Lock wait timeout exceeded

解决MySql ERROR 1698 (28000) 错误:Access denied for user 'root'@'localhost'

Laravel:验证表单中的名称输入

mysql ERROR 1045 (28000): 错误解决办法

mysql ERROR 1045 (28000): 错误解决办法