访问深度嵌套的params rails

时间:2011-10-14 00:33:33

标签: ruby-on-rails controller params nested-attributes

我正在我的控制器中编写一段代码,用于以00:00的形式获取用户输入的数据,并在将其发送到模型之前将其转换为分钟。我正在使用的代码非常简单,只需将:duration参数拆分为冒号并将小时数乘以60并将分钟数添加到该数字。当我提交for时,我在尝试对nil对象执行拆分时遇到错误。这必须意味着我没有正确访问参数,但我很困惑,我将如何导航到深层嵌套的参数,似乎无法找到任何有关深层嵌套参数的文档。

以下是我的模特组织:

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部分但我似乎无法正确理解它。我对rails /编程很新,所以可能会有一些我很想念的东西......

修改

以下是过去参数的日志信息:

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 个答案:

答案 0 :(得分:1)

您可以将您想要的参数分配给您的模型,如下所示:

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中,返回方法的最后一个语句,因此这会将计算的持续时间返回到save方法,该方法将为我们根据传递给方法的参数创建的exercise对象的workout_time对象设置持续时间。 / p>