使用nested_attributes表单创建新模型记录或查看它是否已存在 - Rails 4

时间:2016-09-04 04:42:42

标签: ruby-on-rails ruby-on-rails-4 parent-child jquery-ui-autocomplete nested-attributes

我使用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

1 个答案:

答案 0 :(得分:1)

所以你要做的是拥有一个child accepts_nested_attributes_for一个parent

基本上,最简单的解决方案是传递parent_id如果您已经有想要与您的孩子关联的父级,或者如果您要创建它则传递parent_attributes

可能需要您手动检查控制器中的请求参数和删除未使用的参数以避免混淆。例如,如果您传递parent_id,则要从返回的哈希中完全删除parent_attributes,但如果parent_id = nil,则要删除parent_id并离开parent_attributes }