我有一个具有start_at
和end_at
属性的模型。在最终用户的表单中,我使用标准start_at
显示datetime_select
,但我宁愿不向用户显示第二个日期时间选择。我希望我能创建两个表示持续时间的字段;一个小时,另一个几分钟。我的问题是,在我看来,如何在编辑现有条目时使用表单助手自动填写字段。此外,我如何将其连接到模型,然后使用真实属性end_at
保存录制内容?
提前感谢您提供任何建议!
答案 0 :(得分:1)
我必须这样做,我一直在做以下事情:
params[:examplemodelname].delete :distance if params[:examplemodelname].has_key? :distance
ExampleModelName.new(params[:examplemodelname])
或@examplemodelname.update_attributes(params[:examplemodelname])
。答案 1 :(得分:0)
这样的逻辑不会更好 适合模特?胖模特, 瘦骨的控制器?
我认为这是绝对正确的。我鄙视使用控制器这样的东西。在我看来,控制器最适合用于一些事情:
当然,每个人都必须找到自己的平衡点,但我发现“制造例外”这样的事情往往导致各地的例外情况。更不用说控制器逻辑更难测试。
要回答您的问题:您只需在模型中定义虚拟属性,以帮助您在start_at和持续时间之间进行转换。类似的东西:
# Return the duration in seconds. Will look different if you want to use
# multiparameter assignment (which you definitely should consider)
def duration
(end_at - start_at).seconds
end
# Store the duration as an instance variable. Might need to use multiparameter
# assignment if you use a time_select() in the view.
def duration=(arg)
@duration = arg
end
before_save :set_end_at
def set_end_at
end_at = start_at + @duration.seconds
end
我通常在before_save中设置实际属性,以避免表单赋值中的任何竞争条件。你无法保证start_at会在持续时间之前或之后被分配,这可能会在你原本不错的逻辑中引入错误。