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

cas*_*ral 3 forms ruby-on-rails

我有一个包含 3 个表单的视图,即“日程表”、“锻炼”和“练习”,每个表单的行为都类似于编辑表单。所有视图中都有一个提交(保存)按钮。

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

对此最好的解决方案是什么?Javascript 更新每个数据是分开的吗?怎么做 ?有没有更 Rails 的方法可以轻松做到这一点?

我的困难是如何将所有这些模型集成在一个视图中,而所有这些都发生在学生模型的显示(视图)中。

Ric*_*eck 5

如果您正在实现类似profile/edit页面的内容(您可以在其中一次保存所有记录),我会考虑的两种方法是通过 Ajax 保存表单,或者使用单个提交方法来处理它们


阿贾克斯

ajax 方法是最传统的:

  1. update您提交的每个表单都将转到后端表单自己的方法
  2. 每个表单都可以通过一个按钮处理,但最好将它们分开
#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
});
Run Code Online (Sandbox Code Playgroud)

单身的

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

我会这样做:

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

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

#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 %>
Run Code Online (Sandbox Code Playgroud)

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