【问题标题】:Merge two forms rails合并两个表单栏
【发布时间】:2013-07-20 10:51:50
【问题描述】:

基本上我在这里遇到@user1224344 之类的问题:

How to submit multiple, duplicate forms from same page in Rails - preferably with one button

第一个答案看起来很不错,但我作为 Rails 初学者在我的项目中转置它时遇到问题。好的,我有两个具有相同控制器的表单,应该只用一个提交按钮保存:

<table width="100%">
<tr>
<%= form_for([@patient, @patient.treatments.build]) do |f| %>
<th><%= f.collection_select :category_id, Category.find(:all), :id, :typ %></th>
<th><%= f.text_field :content %></th>
<th><%= f.hidden_field :note, :id => "canvascontent" %></th>
<th><%= f.text_field :day, :value => Date.today %></th>
<th><%= f.submit  :class => 'btn btn-small btn-primary', :onclick => "sketch.toDataURL()"  %></th>
<th><input type="button" onclick="sketch.clearRecording()" class="btn btn-small btn-danger" value="Löschen"></th>
<% end %>
</tr>
</table>


<table width="100%">
<tr>
<%= form_for([@patient, @patient.treatments.build]) do |f| %>
<th><%= f.collection_select :category_id, Category.find(:all), :id, :typ %></th>
<th><%= f.text_field :content , :id => "inputbox"%></th>
<th><%= f.text_field :day, :value => Date.today %></th>
<th><%= f.submit  :class => 'btn btn-small btn-primary'%></th>
<% end %>
</tr>
</table>

感谢您的帮助!特别是在周日晚上(至少在德国)

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    你已经很接近了。

    诀窍是两个表单都应该嵌套在提交它们的表单中,这应该是另一个模型。我不知道您的应用程序是如何组合在一起的,但我会假设患者有很多治疗。您的模型应包括以下内容:

    患者.rb

    attr_accessible :treatments_attributes, etc...
    has_many :treatments
    accepts_nested_attributes_for :treatments
    

    治疗.rb

    belongs_to :patient
    

    如您所见,患者接受其治疗的属性(因此是该模型中的第三行和第一行)。因此,您实际上需要将治疗表单包装在患者表单中,以便您提交带有嵌套治疗的患者表单。像这样的:

    <%= form_for @patient do |f| %>
      <%= f.fields_for @patient.build_treatment do |tf| %>
        <%= render 'treatment_form', locals: { form: tf } %>
      <% end %>
      <%= f.fields_for @patient.build_treatment do |tf| %>
        <%= render 'treatment_form', locals: { form: tf } %>
      <% end %>
      <%= f.submit %>
    <% end %>
    

    因此,您已经为提交两种治疗表格的患者获得了一份表格,该表格自动与患者相关联。我可能搞砸了那里的一些细节,但这是基本的想法。

    编辑 -- 您可能需要检查this out。最好将处理表单对象的构建放在您的控制器中,就像他们在那个问题中所做的那样。您可能想查看Rails API for more specific help on accepts_nested_attributes_for.

    另外,如果不清楚,“locals”只是将处理表单对象传递给变量名称“form”下的部分,所以在那个部分中,你会写 ...等等,在那个部分内。

    如果您在控制器中构建表单对象 --

    @patient.build_treatments #may not be exactly this, but it's close
    

    --那么你可以在你的视图中这样做:

    <%= f.fields_for :treatment do |tf| %>
    

    另外,如果不清楚,根据您上面的代码,您的部分会看起来像这样:

    <table width="100%">
      <tr>
        <th><%= form.collection_select :category_id, Category.find(:all), :id, :typ %></th>
        <th><%= form.text_field :content , :id => "inputbox"%></th>
        <th><%= form.text_field :day, :value => Date.today %></th>
      </tr>
    </table>
    

    其他可能更直观的布局:

    主视图

    <%= form_for @patient do |f| %>
      <%= render 'treatment_form', form: f %>
    <% end %>
    

    局部视图

    <%= form.fields_for :treatment do |field| %>
      <% field.label :whatever %> #...
    

    换句话说,您可以将调用移到部分内部的 fields_for 中,这可能更有意义。实际上不应该改变任何事情的真正运作方式。

    【讨论】:

    • 这个人看起来真好!你真的帮了我!顺便说一句,你有一张非常酷的个人资料照片!但是我有一个小问题,在部分 _treatment_form 中我得到了错误:未定义的局部变量或方法 `form' for
    • 嗯。那应该行得通。这就是我们对“本地人”所做的事情。基本上“locals”是局部变量的散列。你说“form”将是一个等于“tf”的变量。无论如何,你也应该能够做到 让我知道这是否有效。
    • 好的,现在它可以使用 form: tf!我会测试它,然后我给你的答案打分!再次感谢!您是专业的 Rails 开发人员吗?
    • 哈。最近开始,是的。很高兴这有帮助。我不久前学习了 Rails/编码,我记得这一切都非常令人困惑,所以希望这能澄清一点。
    • 好的,你的回答无论如何都是正确的,而且非常好!但到目前为止它不会真正起作用,因为患者控制器中的某些内容没有定义,但我将其移至另一个问题 stackoverflow.com/questions/17776091/…
    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    相关资源
    最近更新 更多