【发布时间】:2010-09-02 00:29:18
【问题描述】:
我对 Ruby 和 Rails(使用 2.3.8)都很陌生,所以如果我在这里遗漏了一些非常明显的东西,请原谅我,但我已经为此苦苦挣扎了一段时间,而且我的搜索没有结果。
在我的代码中,我有计划,而一个计划有许多 Plan_Steps。每个 Plan_Step 都有一个数字(表示“1st”、“2nd”等)。我有一个更新计划的表格,我需要验证每个 Plan_Step 是否具有唯一编号。下面的代码可能会更好地解释设计:
models/plan.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 模型中进行验证,因为除非我弄错了,否则验证将针对数据库(而不是传入的参数)进行。
如果这是一个措辞不当的问题,我深表歉意,但它相当具体。如果您需要任何澄清,请询问。
请记住,我是菜鸟,所以我很容易犯一些非常愚蠢的错误。
【问题讨论】:
-
稍微反思一下,我的问题实际上可以归结为:更新具有嵌套属性的模型时,是否有任何方法可以访问传入的关联/嵌套模型的值(通过 params[] 哈希)?在我的示例中,当我尝试访问“plan_steps”时,我想获取传递给“update_attributes”的值,而不是来自数据库的值。有什么办法得到它们?
标签: ruby-on-rails validation associations nested-forms