【问题标题】:Datetime changing ruby日期时间更改红宝石
【发布时间】:2015-05-28 07:01:32
【问题描述】:

我有一个活动,想为他们的开始和结束日期添加 1 天。代码:

params[:event][:start_time] = [:event][:start_time] + 1.day
        params[:event][:end_time] = [:event][:start_time] + 1.day

这应该添加到开始和结束时间 1 天,但它不起作用。

错误是:

no implicit conversion of Symbol into Integer

有人可以帮忙吗?

【问题讨论】:

  • 您的变量包含 Array 实例(采用 [hash_key, hash_value] 格式),因此它不需要 Symbol in [] 方法
  • 你能告诉我们params[:event][:start_time]的价值吗?
  • @shivam 你能告诉我怎么做吗?
  • 我认为参数有问题,所以请发布日志
  • @AmitSharma 我刚接触 Rails。你能告诉我怎么做吗?

标签: ruby-on-rails ruby time


【解决方案1】:

这里有两个错误。第一个是您在表达式的第二部分中缺少params,因此您将数组数组分配给参数,从而有效地覆盖params。

params[:event][:start_time] = [:event][:start_time] + 1.day

应该是

params[:event][:start_time] = params[:event][:start_time] + 1.day

第二个问题是params 中存储的值是String,而不是日期或整数。因此,您需要转换值

params[:event][:start_time] = Time.new(params[:event][:start_time]) + 1.day

还有两个额外的潜在问题:(1) 您正在覆盖原始参数,这绝不是一种好的做法 (2) 值可能是 nil,从而导致您的应用崩溃。

event = params[:event].presence || {}
event[:start_time] = Time.parse(event[:start_time]) + 1.day if event[:start_time]
event[:end_time]   = Time.parse(event[:end_time]) + 1.day   if event[:end_time]

现在event 变量保存了正确的参数哈希。

【讨论】:

  • 没有将 Symbol 隐式转换为 Integer 得到同样的错误(
  • 在一个例子中有一个小错字,但最终的代码是正确的。另外,请尝试按照我提供的说明进行操作,它们将帮助您理解代码(而不仅仅是复制解决方案)。
【解决方案2】:
params[:event][:start_time] = DateTime.parse(params[:event][:start_time]) + 1.days
params[:event][:end_time] =  DateTime.parse(params[:event][:end_time]) + 1.day

或

params[:event][:start_time] =  DateTime.parse(params[:event][:start_time]).next_day

【讨论】:

  • 无论如何都没有将 nil 隐式转换为 String 错误 ((
  • 你应该检查params[:event][:start_time]的值,可能是无效的。
  • 勾选,全部有效
【解决方案3】:
def create
  (1..10).each do |i|
    params[:event][:user_id] = current_user.id
    start_time = DateTime.new(params[:event]['start_time(1i)'].to_i, params[:event]['start_time(2i)'].to_i, params[:event]['start_time(3i)'].to_i, params[:event]['start_time(5i)'].to_i, params[:event]['start_time(4i)'].to_i)
    end_time = DateTime.new(params[:event]['end_time(1i)'].to_i, params[:event]['end_time(2i)'].to_i, params[:event]['end_time(3i)'].to_i, params[:event]['end_time(5i)'].to_i, params[:event]['end_time(4i)'].to_i)
    if i > 1
      params[:event][:start_time] = (start_time + "#{i}".to_i.day)
      params[:event][:end_time] = (end_time + "#{i}".to_i.day)
    end
    @event = Event.new(event_params)
    @event.save
  end
  redirect_to events_path
end

【讨论】:

  • 仍然不起作用,“+”符号中的错误。可能是 activesupport 中的问题
  • 尝试获取参数值[:event][:start_time]
  • 无论如何都没有将 nil 隐式转换为 String 错误
  • 在此处粘贴您的 params[:event][:start_time] 值
  • 我从


猜你喜欢
  • 2019-05-16
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多