【问题标题】:Building nested attributes from form checkboxes in a model callback?在模型回调中从表单复选框构建嵌套属性?
【发布时间】:2011-01-23 12:53:47
【问题描述】:

我正在为一个小型分析实验室构建一个简单的样本跟踪器,我正在努力解决一个问题。在结构上,数据库由用户、批次、样品、仪器和化验组成。请原谅凌乱或糟糕的代码,我是 Rails 和编程的新手。一般来说,我知道我在哪里马虎以及如何解决它,这只是我解决问题的问题。这是一些明确的删节代码:


class Batch  

  belongs_to :user
  has_many :samples
  has_many :submissions
  has_many :assays, :through => :submissions

  accepts_nested_attributes_for :samples
  accepts_nested_attributes_for :submissions

end

class Assay  

  belongs_to :instrument
  has_many :submissions
  has_many :batches, :through => :submissions

end

class Submission  

  belongs_to :batches
  belongs_to :assays

end

我创建了一个批处理提交表单,它接受批处理信息、样本名称作为嵌套属性,并且我也尝试将提交作为嵌套属性接受。我的表单目前看起来像这样(请注意评论行):


= semantic_form_for @batch do |f|

  - @instruments.each do |instrument|
    %ol
      %li 
        = instrument.instrument_name
        %ol
          - instrument.assays.each do |assay|
            %li
              = assay.assay_name
              # Some magic check boxes that fix my problem. 

    = f.inputs :name => "Batch Info" do 
      = f.input :sampling_date, :required => false 
      = f.input :experiment_name, :required => false 
      = f.input :notes, :as => :text 

    = f.semantic_fields_for :samples do |sample_form|
      = sample_form.input :sample_name
    = f.buttons do 
      = f.commit_button :label => "Submit batch"

我想要的是每个化验的复选框,它将assay_ids 作为嵌套批次属性传递到提交表,神奇地确保每个批次都与所选的化验相关联。

我的问题是决定何时以及如何在控制器/模型中构建提交以及如何填充它们。似乎我应该制作某种包含assay_ids的参数,并使用某种模型回调(before_create或before_save)来构建params[assay_ids].length数量的虚拟提交,我可以用assay_id参数填充。不幸的是,我所有尝试构建这样的方法都是徒劳的。

我已经观看了我能找到的所有相关 Railscast,阅读了 API 条目,而且我已经为此研究了太多小时。我可以在我的脑海中感受到答案,我迫切需要一个啊哈!片刻。感谢您提供的任何帮助!

【问题讨论】:

    标签: ruby-on-rails forms callback data-modeling


    【解决方案1】:

    注意:这个方法很脆!我制定了一个解决方案,使批次成为真正的嵌套属性,我会尽快写出来。

    因此,经过一天的思考,答案突然出现在我脑海中(我发誓我使用 Stack Overflow 正式启动 12 小时计时器,以便我顿悟地找出我做错了什么)。我是这样做的:

    基本上,我试图只提交我需要的尽可能多的提交,因此我最终不会用空的数据库来填满我的数据库,但我也希望它们以即时的形式构建。因为我不想在我的视图中加入一堆额外的逻辑,所以我将我的魔法复选框设置为check_box_tag "assay_ids[]", assay.id 以使一个很好的参数与批处理参数分开。然后,在create 下的批次控制器中,我构建了一个小辅助方法:

    def build_submissions(参数) @submitted_assays = 参数[:assay_ids] 对于@submitted_assays 中的提交分析做 @batch.submissions.build(:assay_id => submit_assay) 结尾 结尾

    这可以构建我需要的尽可能多的提交。此修复程序非常有效,但我欢迎任何有关如何以不同方式解决问题的建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多