将“01-”附加到 rails 控制器上的强参数

append '01-' to strong parameter on rails controller

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

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

我在后端有 postgreSQL 数据库,日期时间列存储这个日期,显然需要完整格式的日期 'dd-mm-yyyy' 来保存它。当 POST 将表单发送到我的控制器时,这就是我遇到的情况:

Experience.update(date_from: '02-2016') 将 table 更新为 date_from 列的零值

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

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

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

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

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

你可以用Date.iso8601(str)DateTime.iso8601(str)解析它。

我会创建一个模型级别 setter 来处理这个问题:

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

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

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