2015-12-30 69 views
1

我正在Rails 4中制作应用程序。我使用简单表单。Rails - 单个属性的多个条目

我有一个配置文件模型和资格模型。

的关联是:

profile.rb

belongs_to :profile 

qualifications.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

有另一种方式来实现这一目标?

回答

0

您将寻找一颗名为cocoon的宝石;你也可以观看this Railscast (Nested forms),这是令人遗憾的过时,但仍然很好地解释了结构。


的模式很简单,但需要一些额外的部件:

  1. 有一个Ajax按钮,呼叫控制器
  2. 控制器需要返回一个形式,并内置fields_for
  3. 您将使用JS将新的fields_for添加到原始表单

最大的问题是你的新fields_forid - 这种模式的新的实现使用child_index: Time.now.to_i

我写这个here

这里有一个新的版本:


阿贾克斯

首先,你需要一个“添加资格”按钮,通过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 %> 

控制器

这将通过控制器的方法,这是我们应该能够设法返回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 ... %> 

...

+0

嗨丰富,非常感谢这一点。这一切都非常清楚和有益,并且很有意义。在使用茧之前。我试图按照你的步骤。我遇到的问题是我想要编辑现有的配置文件以添加新的限定,我在<%= button_to“+”,new_profile_path,method :: get%>中出现错误。如果我改变它来更新,那么是否需要在更新字段中重复控制器操作,或者是否知道在新操作中查找它? – Mel

+0

我已经完成了上述步骤并尝试使用cocoon,但是这样做:<%= link_to_add_association'添加资格',f:f,部分:'qualifications/qualification_fields'%> 给出了一个未定义的方法'object' :0x007fe70a4b38d8>。我不知道这个错误是什么意思,但会提出一个新的问题来寻求帮助解释它。 – Mel

+0

你能给我一个github回购的链接吗?我会看看它如果没关系 –

0

看来你必须使用嵌套形式。你必须尝试你的链接教程,因为我也会使用它。对于另一个教程,您可以将其用作参考nested_forms-rails-4.2

我希望这对你有所帮助。