我对 Ruby 和 Rails(使用 2.3.8)都很陌生,所以如果我在这里遗漏了一些非常明显的东西,请原谅我,但我已经为此苦苦挣扎了一段时间,而且我的搜索没有结果。
在我的代码中,我有计划,一个计划有很多 Plan_Steps。每个 Plan_Step 都有一个数字(表示“1st”、“2nd”等)。我有一个更新计划的表格,我需要验证每个 Plan_Step 是否有唯一的编号。下面的代码可能会更好地解释设计:
模型/计划.rb:
Class Plan < ActiveRecord::Base
has_many :plan_steps
accepts_nested_attributes_for :plan_steps, :allow_destroy => true
validate :validate_unique_step_numbers
# Require all steps to be a unique number
def validate_unique_step_numbers
step_numbers = []
plan_steps.each do |step|
#puts step.description
if !step.marked_for_destruction? && step_numbers.include?(step.number)
errors.add("Error Here")
elsif !step.marked_for_destruction?
step_numbers << step.number
end
end
end
控制器/plans_controller.rb:
...
def update
@plan = Plan.find(params[:id])
if @plan.update_attributes(params[:plan])
#Success
else
#Fail
end
end
现在,当我的表单提交更新时,params 哈希如下所示:
{"commit"=>"Submit",
"action"=>"update",
"_method"=>"put",
"authenticity_token"=>"NHUfDqRDFSFSFSFspaCuvi/WAAOFpg5AAANMre4x/uu8=",
"id"=>"1",
"plan"=>{
"name"=>"Plan Name",
"plan_steps_attributes"=>{
"0"=>{"number"=>"1", "id"=>"1", "_destroy"=>"0", "description"=>"one"},
"1"=>{"number"=>"2", "id"=>"3", "_destroy"=>"0", "description"=>"three"},
"2"=>{"id"=>"2", "_destroy"=>"1"}},
"controller"=>"plans"}
该数据库包含 Plan_Steps 的条目,其中包含以下内容:
ID=1, Number=1, Description='one'
ID=2, Number=2, Description='two'
请注意 ID=2 与 Number=2 存在,我要做的是删除 ID=2 并创建一个 Number=2 的新条目(ID=3)。
好的,所以有了这个设置,这是我的问题:
当我在验证中调用 plan_steps 时,它似乎是从数据库中提取值,而不是从传递给 update_attributes 的 params[] 数组中提取值。
例如,如果我在验证中取消注释“puts”行,我会看到 Plan_Steps 的描述,因为它们存在于数据库中,而不是它们存在于传入的参数中。这意味着我无法验证传入的 Plan_Steps。
我也无法在 Plan_Steps 模型中进行验证,因为除非我弄错了,否则验证将针对数据库(而不是传入的参数)进行。
如果这是一个措辞不当的问题,我深表歉意,但它相当具体。如果您需要任何澄清,请询问。
请记住,我是一个菜鸟,所以我很容易犯一些非常愚蠢的错误。