将多个控制器参数处理为单个模型属性?

时间:2017-06-26 04:56:19

标签: ruby-on-rails model-view-controller strong-parameters

修改

事实证明我误解了#date_select形式辅助方法是如何工作的 - 我根据this answer得出了下面的方法,但经过一些修补后,I discovered that, in typical Rails fashion, #date_select actually handles the whole thing automagically

在任何情况下,有时候我还想做类似的事情:例如,如果我想将单个User.tenure属性捕获为序列化哈希({ start: <year>, end: <year> }),并且我在视图表单中将其实现为两个单独的字段,这些字段返回参数:tenure_start:tenure_end

逻辑在哪里将这两个参数转换为单个模型属性?

我的问题,特别是

我想在我的应用程序中为User模型设置“生日日期”属性。 “新用户”表单使用Rails的内置#date_select form helper method

在视图中,#date_select为年,月和日创建三个单独的下拉菜单。在控制器中,returns three separate parametersdob(1i)dob(2i)dob(3i)。这些参数中的每一个都是其相应字段的字符串表示(例如,如果您选择1992/7/14,参数值为"1992""07"和{{ 1}})。

我想将这三个字符串参数转换为单个"14"对象,并将其分配给新的Date

这个问题,一般是

我对MVC的理解是控制器应该很薄:它的工作仅仅是在模型和视图之间传递信息。但在上述情况下,存在没有相应模型属性的控制器参数。因此,

User

不起作用,因为User.create(user_params) 不接受User::new属性(并且如果确实如此,则不知道如何处理它)。需要将它们处理为单个值,如

:"dob(1i)"

之后才能将其保存到dob = params.fetch(:player).values_at(%i(dob(1i) dob(2i) dob(3i))).map(&:to_i) params.fetch(:player)[:dob] = { player: { dob: Date.new(dob[0], dob[1], dob[2]) } } 属性中。

我的问题是这样的:这个逻辑在控制器中属于多少,模型属于多少?

  • 是否应该让控制器处理输入的转换,并使用所需的数据实例化模型?
  • 或者控制器是否应该简单地将三个字段连接成一个字符串(,例如 dob)并将其保留到模型中,以便在保存之前将其转换为"19920714"
  • 或者有没有办法将三个未经处理的原始参数传递给模型对象并让处理转换?
  • 或者还有其他我没有想过的可能吗?

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作,将实际日期存储在数据库中

 year = "1992"
 month = "14"
 day = "07"
 dob = m + '/' + d + '/' + y
=> Date.parse(dob)
=> Tue, 14 Jul 1992