Rails新手,如果我遗漏了一些明显的东西,请原谅我。
我有一个名为Game
的模型,其表中的datetime
列名为occurred_at
。正如您可能猜到的那样,信息用于存储game
发生的日期/时间。到目前为止,在创建game
个对象时,我使用seeds.rb
通过调用occurred_at
来填充Time.parse(str)
属性。 (例如Time.parse("1 February 2017 5:00 PM PST")
)
现在,我正在处理_form
和games#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
没有date
和time
方法。 @game
的日期和时间可通过@game.occurred_at
访问。直观的解决方案是在我的参数中传递date
和time
,然后在我的GamesController
中添加逻辑以相应地创建/更新@game.occurred_at
。
所以我有三个问题:
date
和time
参数并将其合并到GamesController
的基础解决方案有正确的想法?如果没有,那么实现更新:occurred_at
的目标的最佳方法是什么?params
会在控制器中直接传递给负责创建或更新对象的方法。这会影响我的问题。答案 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!
有更快的方法对此进行编码,但我故意让每行都能让您了解正在发生的事情。