2014-03-30 25 views
1

我在尝试将数据插入到具有涉及两个模型的复杂形式的数据库时遇到问题,并且我搜索了Stackoverflow上的每个帖子以找到最佳答案,但是我无法靠近任何地方靠近。试图为具有多态关联的模型插入数据

在我的模型

class ClientIndividual < ActiveRecord::Base 
    has_one :client_assignment, :as => :clientassignmentable 

    accepts_nested_attributes_for :client_assignment 
end 

class ClientAssignment < ActiveRecord::Base 

    belongs_to :clientassignmentable, :polymorphic => true 

end 

在我ClientIndividual控制器

class ClientIndividualsController < ApplicationController 
    before_action :set_client_individual, only: [:show, :edit, :update, :destroy] 
    before_filter :authenticate_user! 

    def new 
    @client_individual = ClientIndividual.new 

    end 

    def create 
    @client_individual = ClientIndividual.new(client_individual_params) 

    respond_to do |format| 
     if @client_individual.save 
     format.html { redirect_to @client_individual, notice: 'Client individual was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @client_individual } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @client_individual.errors, status: :unprocessable_entity } 
     end 
    end 

private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_client_individual 
     @client_individual = ClientIndividual.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def client_individual_params 
     params.require(:client_individual).permit(:title, :first_name, :middle_name, 
:last_name, :date_of_birth, :work_phone, :home_phone, :mobile_phone, :email_address, 
:preferred_contact_type, :residential_address, :residential_suburb, :residential_state, 
:residential_postcode, :same_as_residential, :postal_address, :postal_suburb, 
:postal_state, :postal_postcode, :emergency_contact_person, :emergency_phone_no, 
:industry_type, :has_referral, :notes, clientassignmentable_attributes: 
[:assignment_types_id, :employees_id, :start_date, :manager_id, :client_type]) 
    end 
end 

在我Client_Individual#新观点

<%= form_for(@client_individual) do |f| %> 
    <div class="add_data_section"> 

    <%= f.fields_for (:clientassignmentable) do |client_assignment_form| %> 
     ........ 
     ........ 
     <div class="row_container"> 
     <div class="field 1" style="width: 409px;"> 
      <%=client_assignment_form.label :assignment_types_id, "Assignment Type*"%> 
     </div> 
     <div class="dropdown"> 
      <label> 
      <%= select('client_individual[clientassignmentable]', 'assignment_types_id', AssignmentType.all.collect {|assignment_type| [assignment_type.name, assignment_type.id ] }, {prompt: 'Select Assignment Type'}, :style =>"width: 264px;")%> 
      </label> 
     </div> 
     </div> 
     <div class="row_container"> 
     <div class="field " style="width: 409px;"> 
      <%=client_assignment_form.label :start_date, "Assignment Start Date"%> 
     </div> 
     <div class="inputfield"> 
      <%=client_assignment_form.text_field :start_date, :class=>'assignmentdatepicker', :style=>'width: 260px;'%> 
     </div> 
     </div> 
     <div class="row_container"> 
     <div class="field " style="width: 409px;"> 
      <%=client_assignment_form.label :manager_id, "Manager Appointed*"%> 
     </div> 
     <div class="dropdown"> 
      <label> 
       <%= select('client_individual[clientassignmentable]', 'manager_id', Employee.all.select{ |manager| manager.staff_rank_id == 2}.collect{|employee| [employee.first_name + " " + employee.last_name, employee.id ] }, {prompt: 'Select ManagerList'}, :style =>"width: 264px;")%> 
      </label> 
     </div> 
     </div> 
     <div class="row_container"> 
     <div class="field 1" style="width: 409px;"> 
      <%=client_assignment_form.label :employees_id, "Staff Appointed*"%> 
     </div> 
     <div class="dropdown"> 
      <label> 
       <%= select('client_individual[clientassignmentable', 'employees_id', Employee.all.select{ |employee| employee.user_id == current_user_id}.collect{|employee| [employee.first_name + " " + employee.last_name, employee.id ] }, {prompt: 'Select CurrentUser'}, :style =>"width: 264px;")%> 
      </label> 
     </div> 
     </div> 
    <%=client_assignment_form.hidden_field :client_type%> 
    <% end %> 
...... 
<% end %> 

所以我已经是,我得到了一个ClientIndividual模型有一个ClientAssignment模型。因此,ClientAssignment模型具有ClientIndividual FK,因此在创建新的ClientIndividual数据时,我期望在表单上生成新的ClientAssignment数据。因此,在我的控制,我宣布我的强烈PARAMS像这样

clientassignmentable_attributes: [:assignment_types_id, :employees_id, :start_date, :manager_id, :client_type] 

但我点击保存新的数据,什么也没有插入到数据库...

然后检查我development.log和它说下列。

Started POST "/client_individuals" for 127.0.0.1 at 2014-03-30 19:58:52 +1100 
Processing by ClientIndividualsController#create as HTML 
    Parameters: {"utf8"=>"✓",  "authenticity_token"=>"0Z+BJcjQE7oa+uzdo/2sKRPiV01EQDXfedMkLE7pTjg=", "groups"=>{"id"=>"1"},  "client_individual"=>{"clientassignmentable"=>{"assignment_types_id"=>"1",  "start_date"=>"03/31/2014", "manager_id"=>"13", "employees_id"=>"25", "client_type"=>""},  "title"=>"t", "first_name"=>"t", "middle_name"=>"t", "last_name"=>"t", "date_of_birth"=>"",  "work_phone"=>"", "home_phone"=>"", "mobile_phone"=>"",  "email_address"=>"[email protected]", "residential_address"=>"t", "residential_suburb"=>"t",  "residential_state"=>"t", "residential_postcode"=>"t", "same_as_residential"=>"0",  "postal_address"=>"t", "postal_suburb"=>"t", "postal_postcode"=>"t",  "emergency_contact_person"=>"", "emergency_phone_no"=>"22223", "industry_type"=>"",  "notes"=>""}, "CREATE"=>"Create Client"} 
    [1m[36mUser Load (0.7ms)[0m [1mSELECT `users`.* FROM `users` WHERE `users`.`id` = 1  ORDER BY `users`.`id` ASC LIMIT 1[0m 
Unpermitted parameters: clientassignmentable 
    [1m[35m (0.3ms)[0m BEGIN 
    [1m[36m (0.2ms)[0m [1mROLLBACK[0m 

我不断收到这个不允许的参数:clientassignmentable。但是我已经在我的控制器列入白名单作为强大的参数之一,所以它为什么抱怨?

当然,如果你知道摆在你面前的正确关联是什么,那么这个问题不难确定吗?

我还能遗漏什么?!?!我一直在这个一整天,看起来很迷茫....

回答

0

你应该写

fields_for :client_assignment 

,并改变这种因此在其他地方使用:clientassignmentable

进一步阅读:
http://guides.rubyonrails.org/form_helpers.html#understanding-parameter-naming-conventions
http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

解决与领域中的新形式不使所述问题,控制器,你需要做的

@client_individual.build_client_assignment 
+1

您是不是指fields_for:client_assignment,而不是form_for:client_assignment?原因我需要主窗体来保存新的Client Individual表单。然而,后来,我从另一篇文章中找到了解决方案,建议我应该这样做:012_ fields_for:client_assignment,ClientAssignment.new do | client_assignment_form | 原因如果我只做fields_for:client_assignment,嵌套属性将不会呈现。因为它在创建ClientIndividual时认为ClientAssignment是无类。 – awongCM

+0

@awongCM很棒,抓住了答案。 –

0

我想,我没有出错,这.....

它的阅读设置多态关联的基础知识,经过这么尴尬,我意识到自己的多态性协会是完全完全错误!由于这个原因,当我清楚地知道我的数据库设计的初始步骤完全错误时,我浪费了将近2天的时间来试图保存表单的数据!多么彻底的浪费!

ARRRGGGH !!!!!

现在我需要回到绘图板,找到如何恢复它!

+0

你浪费了一段时间,但希望你也学到了一些东西。经常阅读文档是很好的,会为你节省一些头痛。 –

+1

谢谢迈克尔。的确我应该。在开始使用代码之前,我需要养成这样做的习惯。在做任何实际的代码之前,我应该练习阅读/练习基本知识的习惯。否则,我将在未来再次遇到同样的问题,它肯定看起来不太好...... – awongCM