gpt4 book ai didi

ruby-on-rails - Rails 多个字段到一个模型属性

转载 作者:行者123 更新时间:2023-12-04 03:35:54 25 4
gpt4 key购买 nike

我一直在到处寻找,但似乎找不到一个好的解决方案。

我的表单有一个日期(带有日期选择器的文本字段)和一个时间(带有时间选择器的文本字段),我想将它们映射到一个名为 due_at 的模型字段。 .

到目前为止,我一直在我的 Controller 中使用单独的参数处理它,将它连接到一个日期时间,然后手动设置模型字段,但它很困惑,并且真的认为这个逻辑应该保留在模型/ View 中。

我希望能够将两个表单字段处理为模型中的一个属性,然后将其拆分为错误、编辑操作等。基本上是执行标准 的自定义方式。 datetime_select 确实如此,但我会自己动手。

有什么东西可以放在我的模型中吗?

def due_at=(date, time)
...
end

我找了很多地方,但不知道你会怎么做。人们说使用 javascript 来填充隐藏字段,但对于一个非常简单的问题来说,这似乎不是最干净的解决方案。

任何建议/帮助将不胜感激。

谢谢。

最佳答案

第一:请重命名您的字段,因为 created_at 可能会导致与 ActiveRecord 发生冲突。

我对格式为 M/D/YYYY H:M(24 小时格式的小时/分钟)的字段进行了此操作

在您的模型中:

attr_accessor :due_date, :due_time

before_validation :make_due_at


def make_due_at
if @due_date.present? && @due_time.present?
self.due_at = DateTime.new(@due_date.year, @due_date.month, @due_date.day, @due_time.hour, @due_time.min)
end
end


def due_date
return @due_date if @due_date.present?
return @due_at if @due_at.present?
return Date.today
end

def due_time
return @due_time if @due_time.present?
return @due_at if @due_at.present?
return Time.now
end


def due_date=(new_date)
@due_date = self.string_to_datetime(new_date, I18n.t('date.formats.default'))
end


def due_time=(new_time)
@due_time = self.string_to_datetime(new_time, I18n.t('time.formats.time'))
end

protected

def string_to_datetime(value, format)
return value unless value.is_a?(String)

begin
DateTime.strptime(value, format)
rescue ArgumentError
nil
end
end

现在在 View 中:
<%= text_field_tag :due_time, I18n.l(@mymodel.due_time, :format => :time) %>
<%= text_field_tag :due_date, I18n.l(@mymodel.due_date, :format => :default) %>

现在在 config/locales/en.yml (如果是英文)
  date:
formats:
default: "%m/%d/%Y"
time:
formats:
time: "%H:%M"

当然,您可以更改日期格式。

关于ruby-on-rails - Rails 多个字段到一个模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7724921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com