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