【发布时间】:2014-04-10 15:06:15
【问题描述】:
我想知道是否有人愿意帮助我弄清楚为什么这不起作用。
我有一个模型,我们称之为属于项目模型的任务。我基本上希望每个任务在每个项目中都有一个唯一的名称(Project1 可以有一个名为 task1 的任务,Project2 也可以,但两者都只能有一个名为 task1)。这似乎是 :scope 选项的用途,但它似乎对我不起作用。
任务模型是项目中的嵌套资源,因此我通过project_tasks_path(@project) 调用创建操作。它可以很好地创建任务并将它们分配给项目,但唯一性验证的范围并没有占据主导地位。如果我在Project1 中创建任务task1,我无法在任务2 中创建同名任务。
这是我的设置:
Task.rb
class Task < ActiveRecord::Base
belongs_to :project
validates :name, presence: true, uniqueness: {scope: :project_id}
tasks_controller.rb
def create
@project = Project.find_by(id: params[:project_id])
@task = Task.new(model_params)
#print task to stdout
puts "@task"
ap @task
respond_to do |format|
if @task.save
flash[:notice] = "Successfully created task"
format.js
else
# no flash as form handles errors
format.js { render action: 'new' }
format.html { render action: 'new' }
end
end
end
由于某种原因,当我输出新创建的任务的内容时,我得到以下内容
#<Task:0x007ff7c7c3b178> {
:id => nil,
:name => "test",
:project_id => nil,
:created_at => nil,
:updated_at => nil
}
似乎因为此时尚未设置 project_id,所以它使用 'nil' 作为值。
解决此问题的最佳方法是什么?它只是一个自定义验证器吗?
编辑 1
def model_params
params.require(:model).permit(:name, :project_id)
end
【问题讨论】:
-
不确定您的期望。未设置
project_id时是否不保存任务? -
您不想将
project_id保存为 nil 值吗? -
我看不到您将项目 ID 分配给任务的位置...@task.project_id = @project.id
-
对不起,我应该说,这是一个嵌套资源。此外,每个任务都必须有一个唯一的名称。每个项目都可以有一个任务,其名称在不同的项目中使用,但只有一个。至于分配,再次,这是一个嵌套资源,我调用 create via project_tasks_path(@project)
-
我已经编辑了问题以包含问题的更多细节。
标签: ruby-on-rails validation activerecord ruby-on-rails-4 model