2014-05-15 49 views
2

我有一个3种形式,时间表,锻炼和练习的视图,每个表现都像编辑表单一样。并且在全部视图中提交(保存)按钮。Rails - 多种形式,不同的模型(对象),一个提交按钮

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

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

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

回答

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

+0

也试过了。我点击了提交按钮,什么都没有发生。一名学生有很多时间表,有许多锻炼,每次锻炼都有很多锻炼。感谢你的回答。我正在尝试使用JavaScript,因为我的观点非常复杂。 – cassioscabral

+0

没有解决我的情况。但那会是简单的方法。我只会使用AJAX调用,而不是表单,这对我来说更合适。 – cassioscabral

0

你可以有一些简单的JavaScript迭代所有表单标签并提交它们中的每一个。

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

但是我认为如果你只有一个表格的多个型号,使用fields_for可能会更清洁。

3

如果您正在实施类似于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 
}); 
每个表单

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

我应该这样做:

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

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

+0

尝试使用Javascript。不起作用,正在寻找SO的解决方案,并且人们说第一个解决方案只会提交最后一个表格。顺便说一句,我不得不使用$()。each(..),因为所有的形式。我的主要问题是因为这些字段在表格中,对于开始,我有6个时间表(每个都不相同)的复选框,6个表格。去尝试别人的解决方案。但感谢您的答案。 – cassioscabral