如何使用多个表单字段与rails中的单个方法进行交互?

时间:2010-01-31 01:07:16

标签: ruby-on-rails

我有一个具有start_atend_at属性的模型。在最终用户的表单中,我使用标准start_at显示datetime_select,但我宁愿不向用户显示第二个日期时间选择。我希望我能创建两个表示持续时间的字段;一个小时,另一个几分钟。我的问题是,在我看来,如何在编辑现有条目时使用表单助手自动填写字段。此外,我如何将其连接到模型,然后使用真实属性end_at保存录制内容?

提前感谢您提供任何建议!

2 个答案:

答案 0 :(得分:1)

我必须这样做,我一直在做以下事情:

  1. 使用FormTagHelper版本的电话专门处理该字段。
  2. 在控制器中,从params对象中读取form_tag值。
  3. 删除额外值:
  4.     
        params[:examplemodelname].delete :distance if params[:examplemodelname].has_key? :distance
    
    1. 将“真实”值放入params对象(在您的示例中为ends_at)
    2. 按照惯例致电ExampleModelName.new(params[:examplemodelname])@examplemodelname.update_attributes(params[:examplemodelname])

答案 1 :(得分:0)

  

这样的逻辑不会更好   适合模特?胖模特,   瘦骨的控制器?

我认为这是绝对正确的。我鄙视使用控制器这样的东西。在我看来,控制器最适合用于一些事情:

  1. 在视图和模型之间混洗数据,ala CRUD操作
  2. 访问控制(通常使用before_filters)
  3. 支持花哨的UI动作(多选,向导等)
  4. 当然,每个人都必须找到自己的平衡点,但我发现“制造例外”这样的事情往往导致各地的例外情况。更不用说控制器逻辑更难测试。

    要回答您的问题:您只需在模型中定义虚拟属性,以帮助您在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会在持续时间之前或之后被分配,这可能会在你原本不错的逻辑中引入错误。