доступ к глубоко вложенным парамам рельсов - PullRequest
0 голосов
/ 14 октября 2011

Я пишу кусок кода в моем контроллере, который должен принять данные, которые пользователь вводит в виде 00:00, и преобразовать их в минуты перед отправкой в ​​модель.Код, который я использую, довольно прост: просто разделите параметр: duration на двоеточие, умножьте часы на 60 и добавьте минуты к этому числу.Когда я отправляю for, я получаю сообщение об ошибке, когда он пытается выполнить разбиение на нулевом объекте.Это должно означать, что я не получаю доступ к параметру правильно, но меня смущает то, как я могу перейти к глубоко вложенному параметру и, кажется, не могу найти какую-либо документацию относительно глубоко вложенных параметров.

Вот моя модель организации:

log_entry >>
has many
workouts >>
has many 
workout_times, which has :duration as an attribute 

Это код в моем log_entries_controller:

def convert_duration
  hours, minutes = params[:log_entry][:workout][:workout_time][:duration].split(":")
  params[:log_entry][:workout][:workout_time][:duration] = (hours.to_i * 60 + minutes.to_i)
end

Я попробовал все возможные способы написаниячасть params, но я не могу понять, что это правильно.Я довольно новичок в рельсах / программировании, так что может быть что-то совершенно очевидное, что мне не хватает ...

РЕДАКТИРОВАТЬ

Вот информация журнала параметров прошлого:

Parameters: {
  "commit" => "Save",
  "log_entry" => {
    "date(1i)" => "2011",
    "date(2i)" => "10",
    "date(3i)" => "13",
    "workouts_attributes" => {
      "0" => {
        "time_of_day" => "AM",
        "summary" => "",
        "workout_times_attributes" => {
          "0" => {
            "duration" => "2:00",
            "zone" => "1",
            "_destroy" => "false"
          }
        }
      }
    }
  },
  "authenticity_token"=>"zD6qS6jOSQ3/mRyH7RAgAzWYmwHub0+uBG1sjPVvkEY=",
  "utf8"=>"\342\234\223"
}

1 Ответ

1 голос
/ 14 октября 2011

Вы можете просто присвоить нужный параметр вашей модели следующим образом:

def save
  workout = Workout.new(params[:workout])
  workout.workout_time.duration = convert_duration(workout)  
end

Затем в вашем методе convert_duration выполните:

def convert_duration(workout)
  hours, minutes = workout.workout_time.duration.split(":")
  (hours.to_i * 60 + minutes.to_i)
end

В Ruby последний оператор методавозвращается, поэтому возвращаемая рассчитанная длительность возвращается методу сохранения, который устанавливает длительность для объекта workout_time для объекта тренировки, который мы создали из параметров, переданных методу.

...