在点击导轨上添加一组相同的输入

时间:2016-01-15 22:13:38

标签: ruby-on-rails ruby simple-form nested-forms

如何为教育对象添加一组相同的输入,因此提交后我将有2个新的教育对象?需要通过单击现有输入集之后的图标来显示优选的新集。

这是我的new方法:

def new
  @user = User.new
  @user.educations.build
  @user.works.build
end

我对它的看法:

<%= simple_form_for [:admin, @user] do |u| %>
      <%= u.error_notification %>

      <%= u.input :name, label: "Name" %>
      <p><b>Photo</b></p>
      <%= image_tag(@user.photo_url, size: "80x90",
                    class:"img-rounded") if @user.photo? %>
      <%= u.input :photo, label: false %>
      <%= u.input :tel, label: "Tel.:" %>

      <h3>Education</h3>
      <hr>
      <%= u.simple_fields_for :educations do |e| %>
        <%= e.input :name, label: "University" %>
        <%= e.input :year_started, label: "Started" %>
        <%= e.input :year_finished, label: "Ended" %>
      <% end %>

      # icon `+`
      <i class="fa fa-plus fa-2x"></i>

      <h3>Work</h3>
      <hr>
      <%= u.simple_fields_for :works do |w| %>
        <%= w.input :name, label: "Name" %>
        <%= w.input :year_started, label: "Started" %>
        <%= w.input :year_finished, label: "Ended" %>
      <% end %>


      <%= u.button :submit, "Надіслати" %>
<% end %>

2 个答案:

答案 0 :(得分:2)

如果要在调用new方法时添加额外的对象,则只需要“构建”更多关联对象:

def new
  @user = User.new
  2.times do
    @user.educations.build
  end
  @user.works.build
end

这将为您提供两组education字段(不再需要更改代码)。

如果您想在之后调用额外的对象/字段,那么您已经呈现了new方法,那么您必须动态地执行它,因为{{1}建议使用类似Cocoon的内容。

有一个过时的,但good tutorial here

I've written about it too

-

动态添加字段依赖于一个简单的模式:

  
      
  1. 按钮/图标按
  2.   
  3. Ajax调用控制器
  4.   
  5. Controller使用@Tom Walpole
  6. 构建表单   
  7. Ajax响应将新的fields_for放入DOM
  8.   

这个(ajax)和类似“Railscast”(静态)方法之间的主要区别是它在rails中正确构建fields_for。没有黑客工作......

fields_for

如果您使用的是#app/views/admin/users/new.html.erb <%= link_to fa-icon("plus 2x"), admin_new_user_path, remote: true %> ,那么获得font-awesome-rails帮助后,您最好使用fa-icon gem。

font-awesome

这个问题的关键是#app/controllers/users_controller.rb class UsersController < ApplicationController respond_to :js, :html def new @user = User.new @user.educations.build @user.works.build unless request.xhr? end end #app/views/users/new.js.erb var form = $("<%=j render 'users/new' "); $("form#new_admin_user [[fields_for_identifier]]").html($(form).html()); 方法。 “静态”方法的一个大问题是每个新字段的child_index: Time.now.to_i将与上一个字段完全相同,搞乱了你的参数:

id

上述应该有效,但可能需要调整。

答案 1 :(得分:1)

最简单的解决方案可能是茧宝石 - https://github.com/nathanvda/cocoon