Rails-单个属性的多个条目 [英] Rails - Multiple entries for a single attribute

查看:13
本文介绍了Rails-单个属性的多个条目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用rails 4制作一个应用程序。我使用简单的表单。

我有个人资料模型和资格模型。

关联如下:

profile.rb

belongs_to :profile

资格.rb

has_many :qualifications  

我的个人资料视图中有一个表单,其中包括来自我的资格视图的表单的一部分。

配置文件#表

<%= simple_form_for(@profile) do |f| %>
            <%= f.error_notification %>

              <div class="form-inputs">

          <div class="row">

            <div class="intpol2">
              Your professional qualifications
            </div>

              <%= render 'qualifications/form', f: f %>     

          </div>

资历#表

<%= simple_fields_for :qualification do |f| %>

  <div class="form-inputs">


    <div class="row">
        <div class="col-md-6">
            <%= f.input :title, :label => "Your award" %> 
        </div>

        <div class="col-md-6">


        </div>


    </div>

    <div class="row">
        <div class="col-md-6">
            <%= f.input :level,   collection: [ "Bachelor's degree", "Master's degree", "Ph.D", "Post Doctoral award"] %>
        </div>


        <div class="col-md-6">
        <%= f.input :year_earned, :label => "When did you graduate?", collection: (Date.today.year - 50)..(Date.today.year) %>
        </div>

  </div>

用户可以拥有多个学位。我要添加一个按钮,该按钮会显示‘添加另一个资格’,然后就会有一组新的资格表域可用。

我发现这篇文章试图做一些略有不同的事情。我不想要10组空白的表单域(这会使表单看起来太长)。

Creating multiple records for a model in a single view in Rails

有没有其他方法可以实现这一点?

推荐答案

您将寻找一个名为cocoon的宝石;您也可以观看this Railscast (Nested forms),它非常过时,但仍然很好地解释了它的结构。


该模式非常简单,但需要一些额外的部分:

  1. 有一个调用控制器的AJAX按钮
  2. 控制器需要返回一个表单并构建fields_for
  3. 您将使用JS将新的fields_for追加到原始表单

最大的问题是您的新fields_for-此模式的新实现使用child_index: Time.now.to_i

我已经就此写过here

这是一个新版本:


AJAX

首先,您需要一个"添加资格"按钮,它通过AJAX链接到您的控制器:

#app/views/profiles/_form.html.erb
<%= simple_form_for(@profile) do |f| %>
    <%= f.error_notification %>
    <div class="form-inputs">
       <div class="row">
         <div class="intpol2">Your professional qualifications</div>
         <%= render 'qualifications/form', f: f %>     
       </div>
    </div>
       <%= button_to "+", new_profile_path, method: :get %>
<% end %>

控制器

这将通过new控制器方法,我们应该能够管理该方法以返回对AJAX请求的特定响应:

#app/controllers/profiles_controller.rb
class ProfilesController < ApplicationController
   respond_to :js, :html, only: :new
   def new
      @profile = Profile.new
      @profile.qualifications.build
      respond_with @profile #-> will invoke app/views/profiles/new.js.erb
   end
end

响应

启动new.js.erb后,我们需要生成新的HTML表单,提取fields_for并将其追加到您的视图中:

#app/views/profiles/new.js.erb
var fields_for = $("<%=j render "profiles/form" %>").html(); //-> might need tweaking
$(fields_for).appendTo("#new_profile.form-inputs");

CHILD_INDEX

您还应该将qualifications/form更改为包括child_index

#app/views/qualifications/form.html.erb
<%= simple_fields_for :qualifications, child_index: Time.now.to_i do ...

子索引用于表示fields_for元素中的index。在我们的情况下(因为我们正在创造所有的新记录),这并不重要。使用Time.now.to_i可确保每次都有一个完全唯一的id


最后,您需要确保您是在呼叫:

 <%= simple_fields_for :qualifications ... %> 

...复数

这篇关于Rails-单个属性的多个条目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆