Я довольно новичок в Ruby и Rails (использую 2.3.8), так что простите, если я упустил что-то действительно очевидное, но я некоторое время боролся с этим, и мои поиски были бесплодны.
В моем коде у меня есть планы, а у плана много плановых шагов.Каждый Plan_Step имеет номер (для обозначения «1-й», «2-й» и т. Д.).У меня есть форма для обновления плана, и мне нужно проверить, что каждый 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
controllers /plan_controller.rb:
...
def update
@plan = Plan.find(params[:id])
if @plan.update_attributes(params[:plan])
#Success
else
#Fail
end
end
Теперь, когдамоя форма отправляет обновление, хэш параметров выглядит следующим образом:
{"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 и создать новую запись (ID = 3) с номером = 2.
ОК, так что с этой настройкой, вот моя проблема:
Когда я вызываю plan_steps при проверке, кажется, что он извлекает значения из базы данных, а не из массива params [], передаваемого в update_attributes.
Например, если я раскомментирую строку «Put» в проверке, я вижу описания Plan_Steps в том виде, в котором они существуют в базе данных, а не в том, что они существуют в переданных параметрах.Это означает, что я не могу проверить входящие Plan_Steps.
Я также не могу выполнить проверку в модели Plan_Steps, поскольку, если я не ошибаюсь, проверка будет происходить с базой данных (а не с параметрами, переданными в).
Прошу прощения, если это плохо сформулированный вопрос, но он довольно конкретный.Если вам нужны какие-либо разъяснения, пожалуйста, спросите.
И помните, я новичок, так что я мог легко совершить действительно глупую ошибку.