通过嵌套表单同时创建父级和子级

时间:2016-09-03 20:13:11

标签: ruby-on-rails forms

我正在尝试创建一个表单,创建一个:表演者,并关联多媒体:将网址嵌入表演者。我希望表演者可能有许多与他们相关联的嵌入网址,因此嵌入存储在他们自己的桌子上。当我提交表单以创建新表演者时,无论我是否将表单字段留空,我都会收到两个错误:

Embeds performer must exist
Embeds url can't be blank

在看了一些类似的问题后,我发现没有一个解决方案适合我。以下是一些相关代码:

performers_controller.rb

def new
    @performer = Performer.new
    @performer.embeds.build
end

def create
@performer = Performer.new(performer_params)
    if @performer.save
        flash[:success] = "Performer listed!"
        redirect_to(:back)
    else
        flash[:danger] = "Performer was not listed."
        render 'new'
    end
end

def performer_params
    params.require(:performer).permit(:name, :email, :bio, embeds_attributes: [:embed_id, :url, :performer_id, :_destroy])
end

Performer.rb

class Performer < ApplicationRecord
attr_accessor :name, :bio, :email, :embeds_attributes
has_many :concerts
has_many :embeds, dependent: :destroy, inverse_of: :performer
accepts_nested_attributes_for :embeds, allow_destroy: true, reject_if: :all_blank
validates :name, presence: true, length: { maximum: 200 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
                format: { with: VALID_EMAIL_REGEX }

end

Embed.rb

class Embed < ApplicationRecord
attr_accessor :url, :performer_id
belongs_to :performer, inverse_of: :embeds

validates :url, presence: :true
end

表格

<% provide(:title, 'Create Performer') %>
<h1>Create Performer</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">

    <%= form_for(@performer) do |f| %>
    <%= render 'shared/error_messages', object: f.object %>
    <%= f.label :name %>
    <%= f.text_field :name, class: 'form-control' %>

  <%= f.label :bio %>
  <%= f.text_area :bio, class: 'form-control'  %>

  <%= f.label :email %>
  <%= f.email_field :email, class: 'form-control' %>

  <%= f.fields_for :embeds do |builder| %>
  <fieldset>

      <%= builder.label :url %>
      <%= builder.text_area :url, class: 'form-control' %>
      <%= builder.hidden_field :_destroy %>
      <%= link_to "remove", '#' , class: 'remove_fields' %>

  </fieldset>
  <% end %>

  <%= f.submit "Create performer", class: "btn btn-primary" %>
<% end %>

0 个答案:

没有答案