fields_for在创建新父记录时不创建记录

时间:2015-03-04 14:33:43

标签: ruby-on-rails forms ruby-on-rails-4 nested-attributes fields-for

我在创建父(项目)记录时尝试自动创建子记录(参与者)。我可以创建父(Project)罚款,在其他表格上,我可以创建孩子(参与者)。我似乎无法与父母同时创建孩子(参与者)。

我在Rails 4上,所以我仔细设置了我的强力参数。我只是不明白我做错了什么。

家长控制器:

class ProjectsController < ApplicationController

  def new_project
    @title = params[:ti]
    @project = Project.new  
    @project.participants.build
  end


def create_project
  @project = Project.new(project_params)
  @template = Template.find(params[:t]) 
   @project.participants.build
   @title = params[:ti]
  respond_to do |format|
     if @project.save
        @project.participants.save
        format.html { redirect_to new_milestones_path(:p => @project.id), notice: 'Great! We saved your project details.' }
      else
        format.html {   redirect_to  new_project_path(t: @template.id, ti: @title)         
 }
        format.json { render json: @project.errors, status: :unprocessable_entity }
      end
    end
  end

  def project_params
    params.require(:project).permit( :id, :title, :starts, participants_attributes: [:id, :email, :title, :status, :project_id])
  end
end

型号:

 class Participant < ActiveRecord::Base
   belongs_to :project, inverse_of: :participants
   ........
 end

 class Project < ActiveRecord::Base
   has_many :participants, dependent: :destroy, inverse_of: :project
   accepts_nested_attributes_for :participants, allow_destroy: true, reject_if: proc { |a| a["email"].blank? }
   .........
 end

形式:

 <%= form_for @project, url: create_project_path(ti: @title), html: { :multipart => true, :class=> "form-horizontal", id: "basicForm" }do |f| %> 

   <%= f.fields_for :participants do |ff|%>

     <%= ff.hidden_field :email, :value => current_user.email %>
     <%= ff.hidden_field :title, :value => 'Organizer' %>
     <%= ff.hidden_field :status, :value => 'accepted' %>

   <% end %> 
   <%=  f.text_field  :title, :placeholder => 'Your Project Title'%>
   <%=  f.text_field  :starts, :placeholder => 'mm/dd/yyyy'%>

   <%= f.submit ' SAVE PROJECT' %>  
 <% end %>

更新 我添加了@ project.participants.build,正如Samo建议的那样(我已经更新了上面的代码),这使得fields_for可见......但我的项目没有保存......它重定向回new_project_path。

2 个答案:

答案 0 :(得分:1)

我相信我看到了这个问题。在new_project操作中,请尝试以下操作:

  def new_project
    @title = params[:ti]
    @project = Project.new  
    @project.participants.build
  end

详细说明:如果关联为空/空,fields_for将不会呈现任何内容。您需要participant至少返回一个@project.participants才能查看其字段。 @project.participants.build只会将Participant类的新实例插入到关联中。

答案 1 :(得分:0)

  1. 当您在应用程序中使用Rails 4时,您不需要致电accepts_nested_attributes_for,因为您已经在控制器中调用了params.require
  2. @participant = Participant.new之后,您没有调用Participant.save行动。您确实在@project.save条件内拨打if,您也应该为@participant执行此操作。您可以在重定向到@project.save之前致电project_path。我不确定这是否是正确的方法,但你可以试试它是否有效。 : - )