【问题标题】:append '01-' to strong parameter on rails controller将'01-'附加到rails控制器上的强参数
【发布时间】:2016-10-21 06:19:55
【问题描述】:

我有一个表格,它使用jQuery datepicker 来选择月份和年份。

$(".date-input").datepicker({
                  format: 'mm-yyyy', 
                  startView: "months", 
                  minViewMode: "months" 
                });

我在后端有 postgreSQL 数据库,其中 datetime 列存储此日期,显然需要完整格式的日期 'dd-mm-yyyy' 来保存它。在将表单发布到我的控制器时,这是我遇到的:

Experience.update(date_from: '02-2016') 用 date_from 列的 nil 值更新表

所以,问题是我如何将'01-' 附加到我从控制器上的 POST 请求中作为强参数接收的 date_from 参数中。

【问题讨论】:

  • 我认为你不需要对强参数做任何事情,你可以在保存控制器动作之前修改参数值。
  • 如果您只想在后端保存月份和年份,我建议使用不同的列,因为这样可以避免很多混乱。同样在查询时,您不需要再次运行逻辑来提取它们。
  • 对单个记录的操作进行修改是有意义的.. 但我正在处理 has_many 嵌套属性.. 所以会有多个 Experience 对象嵌套在单个 POST 请求中,例如 @ 987654326@

标签: ruby-on-rails postgresql bootstrap-datepicker


【解决方案1】:

使用ISO8601 Date 格式 (2016-10-21)。

$(".date-input").datepicker({
                  format: 'yyyy-mm-dd', 
                  startView: "months", 
                  minViewMode: "months" 
                });

您可以使用Date.iso8601(str)DateTime.iso8601(str) 对其进行解析。

我会创建一个模型级别的设置器来处理这个:

class Experience < ActiveRecord::Base # or ApplicationRecord
  def date_from=(val)
     super( val.is_a?(String) ? Date.iso8601(val) : val )
  end
end

这意味着您不必担心控制器级别的参数。只需像任何其他标量值一样将其列入白名单,然后让您的模型完成工作。

我只是将值存储为 DATE 类型(作为该月的第一天)。这在数据库查询方面为您提供了最大的灵活性,在您提取记录时也为您提供了一种理智的格式,这样您就不必再次解析字符串。

【讨论】:

  • 是的..在模型上做这件事很有意义..我在模型上用before_save过滤器尝试它..感谢指出setter方法
【解决方案2】:

这与强参数无关。当您使用强参数从后端获取数据时,您可以访问控制器中的信息。你可以试试这样的 -

def create
    datestr = date_params[:datestr]
    date = Date.strptime("01-".concat(datestr), "%d-%m-%Y")
    Experience.update(date_from: date)
end

private

def date_params
    params.require(:dateinfo).permit(:datestr)
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多