构建SQL3 db错误

时间:2014-06-26 19:06:00

标签: ruby-on-rails database sqlite sqlite3-ruby

我正在构建一个技能数据库,并且在开始时我认为我需要一个标题参数,我将其添加为必需的参数。我想一起摆脱标题参数,这样我就可以创造新的技能和描述。现在有一个错误,因为它也在寻找:标题。这是我的控制器:

class SkillsController < ApplicationController



  def index
    @skills = Skill.all
   end

   def show
    @skills = Skill.all
   end

   def new
    @skills = Skill.all

   end

 def create
  @skills = Skill.new(skill_params)
  if @skills.save
    redirect_to :action => 'index'
  else
    @skills = Skill.find(:all)
    render :action => 'new'
  end
end

   def edit
    @skills = Skill.find(params[:id])
    @skills = Skill.find(:all)
   end

   def update
       @skills = Skill.find(params[:id])
      if @skills.update_attributes(params[:skill])
         redirect_to :action => 'show', :id => @skills
      else
         @skills = Skill.find(:all)
         render :action => 'edit'
      end
   end

   def delete
    Skill.find(params[:id]).destroy
    redirect_to :action => 'index'
   end

     def show_skills
      @skills = Skill.find(params[:id])
   end
end

private

  def skill_params
    params.require(:skill).permit(:attribute_1, :attribute_2, :attribute_3)
  end

当我尝试提交新技能时,这是我的错误:

ActiveRecord::StatementInvalid in SkillsController#create
SQLite3::ConstraintException: skills.title may not be NULL: INSERT INTO "skills" ("created_at") VALUES (?)

我认为绕过这个问题的最简单的方法是使技能。标题不是必需的,但我不确定如何确切地解决它。如果有帮助,我也会发布我的/新表格:

<h1>Add new Skill</h1>
<%= form_tag ({action: "create"}) do %>
<p><label for="skill">Skill</label>:
<%= text_field 'skill', 'title' %></p>

<p><label for="skill_description">Description</label><br/>
<%= text_area 'skill', 'description' %></p>
<%= submit_tag "Create" %>
<% end  %>
<%= link_to 'Back', {:action => 'index'} %> 

我试图摆脱&#39;标题&#39;线,它甚至造成了更多的问题。我将继续搞乱代码和研究,并感谢任何对我的问题有所了解的人。干杯并再次感谢堆叠器!

2 个答案:

答案 0 :(得分:0)

看起来您最初使用title约束创建了NOT NULL列,因此数据库不允许在没有标题的情况下创建记录。

如果您确实不需要它,那么您应该从数据库中删除该列。

创建迁移:

bundle exec rails generate migration remove_title_from_skills

编辑创建的迁移文件并添加:

def change
  remove_column :skills, :title
end

运行迁移:

bundle exec rake db:migrate

删除应用程序中对:title的所有其他引用。

答案 1 :(得分:0)

那么,正如我所说,你的skill_params应该是这样的

def skill_params

params.require(:skill).permit(:title,:description)

end

您应该在attributes列表中允许permitted params

有关详细信息,您应该查看 Strong Parameters