【问题标题】:How do I convert a date before saving it to the database in Rails 4?如何在将日期保存到 Rails 4 中的数据库之前转换日期?
【发布时间】:2014-09-23 18:56:11
【问题描述】:

我试图在我的一个模型上使用 bootstrap datepicker 设置一个日期字段。我想在用户选择日期后将日期格式显示为 MM/DD/YYYY。问题是这个日期格式对于我的数据库(YYYY/MM/DD)不正确,我需要在保存之前对其进行格式化。

在我的模型中,我创建了一个 setter 方法

def start_date=(val)
   Date.strptime(val, '%Y-%m-%d')
end

当我在表单中输入日期(例如 2014 年 9 月 23 日)时,我收到一条错误消息,指出日期无效。

我做错了什么?

我的参数

{"utf8"=>"✓",
 "authenticity_token"=>"***",
 "event"=>{"start_date"=>"09/24/2014",
 "user_id"=>"1"},
 "commit"=>"Submit"
 }

编辑

所以在稍微改变我的方法之后

def start_date=(val)
    Date.strptime(val, "%m/%d/%Y") if val.present?
end

我不再收到“无效日期”错误。但是,现在没有日期被保存到记录中。我试过了

def start_date=(val)
    @start_date = Date.strptime(val, "%m/%d/%Y") if val.present?
  end

正如@animatedgif 所建议的那样,但仍然没有任何反应。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    所以我想出了最好的方法(我认为:P)。

    我必须在我的设置器中添加一个 write_attribute() 才能保存。

    def start_date=(val)
        date = Date.strptime(val, "%m/%d/%Y") if val.present?
        write_attribute(:start_date, date)
    end
    

    这会将我的 MM/DD/YYYY 设置为 YYYY/MM/DD,然后将其保存到数据库中。

    【讨论】:

    • 我喜欢你的解决方案,我可能最终会在我的代码中使用你的方法来消除额外的实例变量。
    • 甜心,乐于助人:)
    【解决方案2】:

    我解决此问题的方法是引入我的日期字段的字符串版本(在您的情况下为 start_date_str),并在我的视图中使用它。我还有一个用于新实例变量的 getter 和 setter,它包装了实际日期字段值的转换和设置。

    不要忘记将 start_date_str 添加到 Rails 3 中的 attr_accessible 或 Rails 4 中的白名单中。

      def start_date_str
        @start_date_str || start_date.to_s
      end
    
      def start_date_str=(value)
        @start_date_str = value
        self.start_date = Date.strptime(value, '%Y-%m-%d')
      end
    

    【讨论】:

    • 感谢您的回复,但我认为我在下面的回答中为我的用例找到了更好的方法。
    【解决方案3】:

    你只是返回一些东西,并没有真正设置任何东西。

    def start_date=(val)
        @start_date = Date.strptime(val, '%Y-%m-%d')
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 2012-08-19
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多