Ruby on rails Rails表单提交导致错误
我创建了这个表单:Ruby on rails Rails表单提交导致错误,ruby-on-rails,forms,sqlite,activerecord,Ruby On Rails,Forms,Sqlite,Activerecord,我创建了这个表单: <%= 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_fi
<%= 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 %>
当我提交表单时,我收到以下错误:
SQLite3::ConstraintException:todos.user_id不能为空:插入到“todos”(“已完成”、“已创建”、“截止日期”、“任务”、“已更新的时间”、“用户id”)值(?,,,,,,,?)
有什么问题
编辑:
这是路轨经过的材料:
{"utf8"=>"✓",
"authenticity_token"=>"oJr4ii4szyBVAacBJDNYcZn8QWGrFij4dF1wqD1Fvic=",
"todo"=>{"user_id"=>"1",
"task"=>"Hello World",
"deadline"=>"03/20/2013"},
"commit"=>"Add"}
这就是模型:
attr_accessible :user_id, :deadline, :task, :completed
谢谢正如数据库通知您的那样,问题是您的
Todo
的user\u id
字段不能为零。在保存之前,请确保将其与当前用户关联,可能在控制器中执行以下操作:
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
def create
@task = Todo.new(params[:task])
@task.user = current_user
...
end
或者,如果希望在没有关联用户的情况下创建TODO,请从数据库中删除约束。请求参数中的
用户id
不是零,而在firebug中的隐藏字段
不是零。将parmaters添加到主要问题中可能无法在您的模型中访问,然后(检查您的attr\u accessible
并确保user\u id
存在)。但无论如何,您都不想基于隐藏字段的值分配用户:这会让您暴露给用户,用户只需操纵表单中发送的数据,就有可能将TODO分配给其他用户。我在attr\u accessible
中有user\u id
,但我通过控制器分配了user\u id
现在,它抛出相同的错误,但它现在要求的不是用户id
值,而是任务
值。编辑:通过控制器分配所有值,允许表单成功提交。实际发生这种情况是因为您正在使用参数[:task]
在您的控制器中,但参数是在todo
哈希下发送的。如果您将控制器更改为params[:todo]
这将按您的预期工作。谢谢,它现在可以工作了。如果可以,请解释为什么它以todo
而不是任务的形式通过哈希?