从表单保存日期和时间

时间:2017-03-04 23:35:54

标签: ruby-on-rails forms

Rails新手,如果我遗漏了一些明显的东西,请原谅我。

我有一个名为Game的模型,其表中的datetime列名为occurred_at。正如您可能猜到的那样,信息用于存储game发生的日期/时间。到目前为止,在创建game个对象时,我使用seeds.rb通过调用occurred_at来填充Time.parse(str)属性。 (例如Time.parse("1 February 2017 5:00 PM PST")

现在,我正在处理_formgames#new页面的games#edit。这是(非常基本)我希望_form看起来像:

<%= form_for @game do |f| %>
  <%= f.date_field :date %>
  <%= f.time_field :time %>
  <%= f.text_field :home_team %>
  <%= f.text_field :away_team %>
<% end %>

显然,这不起作用。 @game没有datetime方法。 @game的日期和时间可通过@game.occurred_at访问。直观的解决方案是在我的参数中传递datetime,然后在我的GamesController中添加逻辑以相应地创建/更新@game.occurred_at

所以我有三个问题:

  1. 我是否对传递datetime参数并将其合并到GamesController的基础解决方案有正确的想法?如果没有,那么实现更新:occurred_at的目标的最佳方法是什么?
  2. 如果我对底层解决方案的想法是正确的,我将如何在我的应用程序中实现它?
  3. 通常在创建或更新对象时,params会在控制器中直接传递给负责创建或更新对象的方法。这会影响我的问题。

1 个答案:

答案 0 :(得分:2)

您可以选择多种方式。

1 /您的答案可行,但您需要声明:date和:time作为属性访问器才能工作,并在控制器中添加逻辑以将传递的参数合并到:occured_at

2 /您可以使用rails datetime_select http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-datetime_select

3 /比较复杂的是创建日期时间对象的所有表单输入,但我不确定这是最好的解决方案。

编辑: 为了您的工作答案,您需要像这样编辑您的模型

class Game < ActiveRecord::Base
  attr_accessor :date, :time

  ... rest of your code
end

然后在你的控制器的方法中:

game = params[:game]
date = game[:date]
time = game[:time]
occured_at = Time.parse "#{date} #{time}"
@game = Game.new(game)
@game.occured_at = occured_at
@game.save!

有更快的方法对此进行编码,但我故意让每行都能让您了解正在发生的事情。