ActiveRecord associated objects not being saved when submitting form - Ruby on Rails

时间:2015-08-07 01:30:52

标签: ruby-on-rails ruby rails-activerecord

Im having problems with my child objects (scores) not being saved when submitting a form for a new (Qa).

Here are the models:

QA

  belongs_to :user
  has_many :scores, :dependent => :destory
  has_many :call_components, through: :scores
  accepts_nested_attributes_for :scores

Score

 belongs_to :qa
 has_one :call_component

Call Component Is just a title and description for a score

belongs_to :score

User

has_many :qas
has_many :scores, through: :qas

For whatever reason when submitting the post the scores are not created, the QA is however.

Form

<%= form_for [@qa], role: "form" do |f| %>

  <%= f.label :call_id %>
  <%= f.number_field :call_id, :autofocus => true, class: "form-control monospaced-control", placeholder: "Call Id", required: "" %>

  ... more fields

<% CallComponent.all.each do |comp| %> <!-- Usually is an array of about 5 components, so there 5 scores -->
      <h4><b><%= comp.title.to_s.capitalize %></b></h4>
      <p><%= comp.description.to_s.capitalize %></p>
       <%= f.fields_for :scores, @qa.scores  do |builder|  %>
           <%= builder.label :score, "Score" %>
           <%= builder.number_field :score, :autofocus => true, class: "form-control monospaced-control", placeholder: "Score", required: ""%>
           <%= builder.label :comments, "Comments" %><br />
           <%= builder.text_area :comments, :autofocus => true, class: "form-control monospaced-control", placeholder: "Score", required: ""%>
           <%= builder.hidden_field :call_component_id, :value => comp.id %>
          <% end %>
<% end %>

Here is the QA New method

def new
   @qa = Qa.new
   @qa.scores.build
   # Tried it this way too
   #@score = Score.new
   #@score.build_qa # then in the view linking the form like @score.qa, this didnt work.
end

And here is the QA Create Method

def create
    @qa = Qa.new(qa_params)
    @qa.final_score = @qa.scores.sum(:score).to_i
    @qa.user_id = current_user.id
    if @qa.save
      redirect_to qas_path, notice: "New qa published!"
    else
      flash[:alert] = "Qa not published!"
      render :new
    end
  end
  def qa_params
     params.require(:qa).permit(:call_id,...,:scores_attributes)
  end

Any thoughts on how to fix this would be awesome. Thanks for your time.

1 个答案:

答案 0 :(得分:1)

try this..

def qa_params
     params.require(:qa).permit(:agent_user_id, :call_id, :call_date, :case_number, :completion_date, scores_attributes: [:score,:comments,:call_component_id] )
  end

as you need to specify which attributes of the nested set are permitted.