Rails - 多个表单,不同的模型(对象),一个提交按钮

时间:2014-05-15 06:08:28

标签: ruby-on-rails forms

我有一个包含3种形式的视图,时间表,锻炼和练习,每种形式都像编辑形式一样。并在所有视图中提交一个(保存)按钮。

当我点击保存按钮时。单击后,应更新这些表单上更改的每个数据。

最佳解决方案是什么? Javascript更新每个数据分开?怎么做 ?是否有更多的Rails方法可以轻松完成此操作?

我的困难在于如何在一个视图中集成所有这些模型,而所有这些都发生在Student模型的show(view)中。

3 个答案:

答案 0 :(得分:3)

如果您的所有模特(时间表,锻炼和锻炼)都是关联的,那么使用fields_for应该是个不错的选择。

从以上链接:

<%= form_for @person do |person_form| %>
  First name: <%= person_form.text_field :first_name %>
  Last name : <%= person_form.text_field :last_name %>

  <%= fields_for :permission, @person.permission do |permission_fields| %>
    Admin?  : <%= permission_fields.check_box :admin %>
  <% end %>

  <%= f.submit %>
<% end %>

阅读guides

答案 1 :(得分:3)

如果您正在实施类似profile / edit页面的内容(您可以同时保存所有记录),我会看到的两种方法是通过以下方式保存表单Ajax,或使用单个submit方法来处理它们


<强>的Ajax

ajax方法将是最常规的方法:

  
      
  1. 您提交的每个表单都会在后端转到表单自己的update方法
  2.   
  3. 每个表单可以由一个按钮处理,但最好将它们拆分
  4.   
#app/controllers/profile_controller.rb
def edit
    @schedules = Schedule.all #-> not sure how many records you're using
    @workouts = Workout.all
    @exercises = Exercise.all
end

#app/views/profile/edit.html.erb
<%= form_for @schedule do |f| %>
    <%= f.text_field :test %>
<% end %>

# -> other forms

<%= button_to "Save", "#", id: "save" %>


#app/assets/javascripts/application.js
$("#save").on("click", function() {
    $("form").submit(); // we'll have to define the form to submit
});

<强>单

如果您将所有表单作为一个提交,则必须将它们全部包含在一个表单中,因为发送不同的错误。这可以通过使用 _ 来实现,并通过循环遍历不同的参数在后端处理,单独保存每个参数。

我会这样做:

#app/controllers/application_controller.rb
def submit
    types = %w(schedules exercises workouts)
    for type in types do
        type.constantize.update_attributes()
    end
end

这允许您创建一个表单,其中包含在同一操作中提交的不同数据类型:

#app/views/profile/edit.html.erb
<%= form_tag profile_submit_path do %>
     <%= fields_for @schedules do |f| %>
         <%= f.text_field :title %>
     <% end %>
     # -> fields_for for the other objects
<% end %>

这将允许您将更新的对象发送到控制器,允许他们提交

答案 2 :(得分:0)

您可以使用一些简单的JavaScript来迭代所有表单标记并提交每个表单标记。

或者,如果您打算使用javascript,则可以在更改任何字段时遵循AJAXish自动保存方法。

但我认为如果您使用fields_for为多个模型创建一个表单可能会更清晰。