我使用has_nested_attributes_for创建两个不同模型(父项和子项)的两条记录。目前使用has_nested_attributes,我在父级上的new.html.erb表单成功创建了父级和子级并将它们关联在一起。但是,父记录可以与其关联的子模型的 has_many 。因此,从新表单中,我需要能够输入url属性(父模型上的列),如果url已经存在...它应该弹出为已存在的Parent(我可以使用'rails-jquery - 如果需要jquery,则自动完成'gem for this)...从而在表单上设置现有的父ID。但是,如果它尚不存在,则表单应创建当前成功发生的新父记录和子记录。
我如何更改控制器和视图以完成此类条件嵌套表单?感谢,
家长控制器:
class StoriesController < ApplicationController
def new
@story = Story.new
video = @story.videos.build
end
def create
@story = Story.new(story_params)
if @story.save
flash[:success] = "Your story video has been created."
redirect_to current_narrator
else
flash[:alert] = "Your story or video could not be saved. Please include all fields."
render 'new'
end
end
private
def story_params
params.require(:story).permit(:headline, :url, videos_attributes: [
:imovie,
:director_id
],)
end
end
App / Views / Stories new.html.erb:
<!-- New Story Nested Form -->
<% provide(:title, 'New Story') %>
<div class="container s-in-reg">
<div class="authform">
<h1>New Story</h1>
<%= form_for @story do |f| %>
<div class="field">
<%= f.label :headline %><br />
<%= f.text_field :headline %>
</div><br/>
<div class="field">
<%= f.label :url %><br />
<%= f.text_field :url %>
</div><br/>
<%= f.fields_for :videos do |builder| %>
<div class="field">
<%= render 'video_fields', f: builder %>
# Video_fields partial contains the nested video fields required
</div>
<% end %>
<%= f.submit "Post this story", class: "btn btn btn-info" %>
<% end %>
</div>
</div>
Story.RB模型:
has_many :videos
accepts_nested_attributes_for :videos
validates :headline, presence: true
validates :url, presence: true, uniqueness: true
Video.RB型号:
class Video < ActiveRecord::Base
belongs_to :story
belongs_to :user
has_attached_file :mpeg
has_nested_attributes_for :story
end
答案 0 :(得分:1)
所以你要做的是拥有一个child
accepts_nested_attributes_for
一个parent
。
基本上,最简单的解决方案是传递parent_id
如果您已经有想要与您的孩子关联的父级,或者如果您要创建它则传递parent_attributes
。
可能需要您手动检查控制器中的请求参数和删除未使用的参数以避免混淆。例如,如果您传递parent_id
,则要从返回的哈希中完全删除parent_attributes
,但如果parent_id = nil
,则要删除parent_id
并离开parent_attributes
}