【问题标题】:Rails - Multiple forms, different Models (Objects), one submit buttonRails - 多种形式,不同的模型(对象),一个提交按钮
【发布时间】:2014-05-15 15:00:51
【问题描述】:

我有一个包含 3 个表单的视图,即时间表、锻炼和练习,每个表单的行为都像一个编辑表单。所有视图中都有一个提交(保存)按钮。

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

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

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

【问题讨论】:

    标签: ruby-on-rails forms


    【解决方案1】:

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


    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
    });
    

    单身

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

    我会这样做:

    #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 %>
    

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

    【讨论】:

    • 尝试使用 Javascript。不起作用,正在在这里寻找解决方案,人们说第一个解决方案只会提交最后一个表单。顺便说一句,我不得不使用 $().each(..),因为所有的形式。我的主要问题是因为这些字段在表格内,一开始我有一个用于 6 个时间表(彼此不同)的复选框,因此,6 个表格。会尝试其他解决方案。不过感谢您的回答。
    【解决方案2】:

    如果您的所有模型(计划、锻炼和练习)都关联,使用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

    【讨论】:

    • 也试过了。我点击了提交按钮,没有任何反应。一个学生有很多时间表,有很多锻炼,每次锻炼都有很多锻炼。感谢你的回答。由于视图的复杂性,我正在尝试使用 javascript。
    • 没有解决我的问题。但这将是最简单的方法。我只会使用 AJAX 调用而不是表单,更适合我。
    【解决方案3】:

    您可以使用一些简单的 javascript 来遍历所有表单标签并提交每个标签。

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

    但我认为,如果您只有一个表格用于多个模型,使用fields_for,它可能会更简洁。

    【讨论】:

      猜你喜欢
      • 2015-10-02
      • 1970-01-01
      • 2019-01-16
      • 2018-01-19
      • 1970-01-01
      • 2015-11-14
      • 2012-12-29
      • 2020-02-18
      • 2017-03-19
      相关资源
      最近更新 更多