0

Я использую has_nested_attributes_for для создания двух записей двух разных моделей (родителя и ребенка). В настоящее время с использованием has_nested_attributes моя форма new.html.erb на родительском сервере успешно создает родительский элемент и дочерний элемент и связывает их вместе. Тем не менее, Родительские записи могут have_many связанная с этим модель детей. Поэтому из новой формы мне нужно иметь возможность вводить атрибут url (столбец родительской модели) и если url уже существует ... Он должен всплывать как уже существующий Parent (я могу использовать «rails-jquery» -autocomplete 'для этого, если требуется jquery) ... тем самым устанавливая существующий родительский идентификатор в форме. Если, однако, он еще не существует, форма должна создать новую родительскую запись и дочернюю запись, как это в настоящее время успешно выполняется.Создайте новую запись модели или посмотрите, существует ли она уже с использованием формы nested_attributes - Rails 4

Как мне изменить свой контроллер и просмотреть, чтобы выполнить эту условную вложенную форму? спасибо,

Родитель контроллер:

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/Истории 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

Итак, что вы хотите сделать, это иметь child, который accepts_nested_attributes_for a parent.

В принципе, самым простым решением является передать parent_id, если у вас уже есть родитель, с которым вы хотите связать своего ребенка, или передайте parent_attributes, если вы только собираетесь его создать.

Возможно, вам потребуется вручную проверить параметры запроса в контроллере и удалить неиспользованный параметр во избежание путаницы. Например, если вы передаете parent_id вы хотите, чтобы полностью удалить parent_attributes из хэша, но если parent_id = nil, то вы хотите, чтобы удалить parent_id и оставить parent_attributes

+0

благодаря shlajin ... поэтому я добавил свой ребенок модель на пост & included has_nested_attributes_for: parent. Но не могли бы вы дать мне представление о том, как этот код может искать действие create? – BB500

+0

Хммм ... Я не совсем уверен, что следую за тобой. Ваша родительская модель - «История», ваш ребенок - «Видео» - что вы хотите создать: «Видео» и ассоциировать или создать «Историю» внутри нее или вы хотите создать «Историю», связать или создать или несколько «видео» с ним? – shlajin

+0

Ну, если история уже существует, форма должна идентифицировать эту историю (через уникальный URL-адрес, который вводит пользователь) и связать новое видео с существующей записью Story. Если URL-адрес ввода пользователя не может быть найден (и, следовательно, история с использованием этого url не существует) ... форма должна создавать как историю, так и видео и ассоциировать их. поэтому я хочу сделать как по существу. – BB500