【问题标题】:Rails 4 validates uniqueness: {scope: :parent_id} for nested resourceRails 4 验证唯一性:嵌套资源的 {scope: :parent_id}
【发布时间】: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


【解决方案1】:

是的,一直在玩这个,似乎进行这种类型的验证的方法非常简单。它所需要的只是嵌套资源与其项目相关,这会强制 :parent_id 按预期传递给验证。

在这个玩具示例的情况下,这意味着创建操作必须看起来像:

@project = Project.find_by(id: params[:project_id])
@task = @project.tasks.build(model_params)

需要注意的是,由于Rails不支持从命令行生成嵌套资源,所以脚手架生成的控制器处理创建的方式是通过Model.new(model_params)然后保存,这个好像没有接@ 987654323@ 及时进行验证,因此需要按上述方式进行更改(就父项而言)。

【讨论】:

    猜你喜欢
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    相关资源
    最近更新 更多