Rails的提交表单导致错误

问题描述:

我创造了这个形式:Rails的提交表单导致错误

<%= form_for @task do |task| %> 
    <%= task.hidden_field :user_id, :value => @user.id %> 

    <%= task.label :task %> 
    <%= task.text_area :task %> 

    <%= task.label :deadline %> 
    <%= task.text_field :deadline %> 

    <%= task.submit "Add" %> 
<% end %> 

和控制器:

def new 
    @task = Todo.new 
    end 

    def create 
    @task = Todo.new(params[:task]) 
    if @task.save 
     set_flash "Task added" 
     redirect_to action: 'index' 
    else 
     set_flash "Task adding failed, Please try again" 
     redirect_to action: 'index' 
    end 
    end 

def set_user 
    @user = current_user 
end 

当我提交表单我得到这个错误:

SQLite3::ConstraintException: todos.user_id may not be NULL: INSERT INTO "todos" ("completed", "created_at", "deadline", "task", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?)

是什么问题?

编辑:

这是由轨道通过parmaters:

{"utf8"=>"✓", 
"authenticity_token"=>"oJr4ii4szyBVAacBJDNYcZn8QWGrFij4dF1wqD1Fvic=", 
"todo"=>{"user_id"=>"1", 
"task"=>"Hello World", 
"deadline"=>"03/20/2013"}, 
"commit"=>"Add"} 

,这是模型:

attr_accessible :user_id, :deadline, :task, :completed 

感谢

由于数据库已通知你,问题在于user_id您的Todo的字段不能为零。确保你保存它,也许做这样的事情在你的控制器之前,与当前用户相关联的是:

def create 
    @task = Todo.new(params[:task]) 
    @task.user = current_user 
    ... 

end 

或者,如果你想待办事项是可创建从数据库中删除约束,而不具有相关用户。

+0

'user_id'不是零请求参数和萤火虫'hidden_​​filed'不是nil.added parmaters主要问题 – Wahtever 2013-03-21 18:34:38

+0

它可能无法在您的模型中访问,然后(检查您的'attr_accessible '并确保'user_id'在那里)。但是,您不希望根据“hidden_​​field”的值来指定用户:这会将用户暴露给潜在用户,这些用户可能通过简单地操纵他们在表单中发送的数据向其他用户分配待办事项。 – Veraticus 2013-03-21 18:37:12

+0

我在'attr_accessible'中有'user_id',我通过控制器分配了'user_id',但是现在它会抛出相同的错误,而不是'user_id'值,它现在要求'task'值。 **编辑**:通过控制器分配所有值允许表单成功提交 – Wahtever 2013-03-21 18:45:20