【问题标题】:Rails Form submitting causing errorRails 表单提交导致错误
【发布时间】:2013-03-21 18:07:00
【问题描述】:

我创建了这个表单:

<%= 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 不能为 NULL: INSERT INTO "todos" ("completed", "created_at", "deadline", "task", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?)

有什么问题?

编辑:

这是 rails 传递的参数:

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

这是模型:

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

谢谢

【问题讨论】:

    标签: ruby-on-rails forms sqlite activerecord


    【解决方案1】:

    正如数据库通知您的那样,问题是您的Todouser_id 字段不能为nil。确保在保存之前将其与当前用户关联,可能在控制器中执行类似的操作:

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

    如果您希望在没有关联用户的情况下创建待办事项,或者从数据库中删除约束。

    【讨论】:

    • 请求参数中的user_id 不是零,而在萤火虫中hidden_filed 不是零。将参数添加到主要问题中
    • 它可能无法在您的模型中访问,然后(检查您的attr_accessible 并确保user_id 存在)。但是您无论如何都不想根据hidden_field 的值来分配用户:这会让您看到用户可能通过简单地操作他们在表单中发送的数据来将待办事项分配给其他用户。
    • 我在attr_accessible 中有user_id,我通过控制器分配了user_id,但是现在它抛出了同样的错误,但它现在要求@ 而不是user_id 值987654333@ 值。 编辑:通过控制器分配所有值允许表单成功提交
    • 这实际上正在发生,因为您在控制器中使用params[:task],但参数是在todo 哈希下发送的。如果您将控制器更改为 params[:todo],这将按预期工作。
    • 谢谢,现在可以使用了。如果可以,请解释为什么它以todo 而不是task 传递哈希?
    猜你喜欢
    • 2011-03-19
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多