2016-10-11 3 views
0

Я пытаюсь создать форму, которая одновременно имеет несколько экземпляров разных моделей.Сохранение нескольких экземпляров моделей в форме рельсов с использованием CRUD

У меня есть мои основные визуализации модели. Визуализация (: title,: cover_image) has_many Строки. A Row has_many Panes (: text_field,: image)

В основном, когда пользователь пытается создать визуализацию, они могут легко выбрать изображение обложки и заголовок. Но я немного смущен, когда я перехожу на следующие два уровня.

Пользователю предлагается создать новую строку в форме, и они могут выбрать 1, 2 или 3 панели в строке. Каждая панель может принимать текст и изображение, но строка не обязательно имеет какие-либо атрибуты.

Как создать несколько строк с несколькими панелями в этой форме? Конечный результат должен обладать множеством строк, состоящих из многих панелей. Могу ли я это сделать в рельсах?

Спасибо за помощь!

+0

Да, Rails отлично подходит для этого. 'accepts_nested_attributes_for' - это то, что вам нужно читать. – Swards

+0

Обратитесь к руководству по направляющим для создания сложных форм [http://guides.rubyonrails.org/form_helpers.html#building-complex-forms] – johnnynemonic

ответ

0

Вы можете делать все, что угодно, в рельсах! Самый лучший подход, на мой взгляд, - создать так называемую модель формы, так как эта форма будет много, и вы не захотите прогнать несколько моделей с проверками и т. Д. Для одного вида вашего приложения. Для этого вы в основном собираетесь создать класс, в который будет входить вся эта информация, выполнить все необходимые проверки, а затем создать любые записи, которые вам нужны, в любых моделях, которые у вас есть. Для этого создайте новый файл в папке с образцом под названием so_much.rb (вы можете сделать любое имя файла, которое вы хотите, просто убедитесь, что вы называете класс таким же, как файл, поэтому Rails находит его автоматически!)

Тогда в вашем so_much. гь файл сделать:

class SoMuch 
    include ActiveModel::Model #This gives us rails validations & model helpers 
    attr_accessor :visual_title 
    attr_accessor :visual_cover #These are virtual attributes so you can make as many as needed to handle all of your form fields. Obviously these aren't tied to a database table so we'll run our validations and then save them to their proper models as needed below! 
    #Add whatever other form fields youll have 

    validate :some_validator_i_made 

    def initialize(params={}) 
     self.visual_title = params[:visual_title] 
     self.visual_cover = params[:visual_cover] 
     #Assign whatever fields you added here 
    end 

    def some_validator_i_made 
     if self.visual_title.blank? 
      errors.add(:visual_title, "This can't be blank!") 
     end 
    end 

end 

Теперь вы можете перейти в контроллер, обрабатывающего эту форму и сделать что-то вроде:

def new 
    @so_much = SoMuch.new 
end 

def create 
    user_input = SoMuch.new(form_params) 
    if user_input.valid? #This runs our validations before we try to save 
     #Save the params to their appropriate models 
    else 
     @errors = user_input.errors 
    end 
end 

private 

def form_params 
    params.require(@so_much).permit(all your virtual attributes we just made here) 
end 

Затем на ваш взгляд, вы бы установить form_for с @so_much как:

<%= form_for @so_much do %> 
    whatever virtual attributes etc 
    <% end %> 

Form Модель немного продвинулся в Rails, но жизнь заставка, когда дело доходит до больших приложений, где у вас есть много различных типов форм для одной модели, и вы не хотите, чтобы все помехи.

+0

Ничего себе, спасибо, это потрясающе! Так что мне нужно сделать контроллер SoMuch, а не выбрасывать этот код в моем контроллере визуализации? – scotchpasta

+0

Нет проблем. Нет, вы хотите, чтобы ваш контроллер обрабатывал ваши взгляды, класс SoMuch, который вы создали, - это просто модель без таблиц, в которой вы будете выполнять проверки в своем коде. Используйте свой обычный контроллер и действия в них и просто вызовите класс SoMuch, как показано. – bkunzi01

+0

Я вижу, что ваш новый стек, а вот еще один совет, который вы уже знаете, все классы моделей доступны во всех ваших контроллерах. – bkunzi01

Смежные вопросы