2016-11-01 3 views
1

У меня есть несколько Lessons, и большинство из них имеют некоторые предварительные условия, которые сами являются другими уроками. Модель Prerequisite представляет взаимосвязь, и каждый из них имеет lesson_id и prerequisite_lesson_id.Создание связанного объекта из коллекции select

class Lesson < ApplicationRecord 
    has_many :prerequisites 
    has_many :prerequisite_lessons, :through => :prerequisites 
end 

class Prerequisite < ApplicationRecord 
    belongs_to :lesson 
    belongs_to :prerequisite_lesson, :class_name => "Lesson" 
end 

Я пытаюсь выяснить способ, так что:

  • Когда я создаю новый Lesson и выбрать один или несколько предпосылок из collection_select
  • кратному Prerequisite объекты создаются на основе что было выбрано, при этом lesson_id является созданным идентификатором Lesson.

Вот часть моего контроллера урока:

def create 
    @lesson = Lesson.new(lesson_params) 

    if @lesson.save 
    if @lesson.prerequisite_ids.length > 0 
     @lesson.prerequisite_ids.each do |p| 
     Prerequisite.new(lesson_id: @lesson.id, prerequisite_lesson_id: p) 
     end 
    end 
    flash[:notice] = "Lesson created..." 
    redirect_to root_url 
    else 
    render :new 
    end 
end 

... 

def lesson_params 
    params.require(:lesson).permit(
    :name, 
    :high_tempo, 
    :low_tempo, 
    :interval, 
    :advance_tempo, 
    prerequisites_attributes: [ 
     :lesson_id, 
     :prerequisite_lesson_id 
    ] 
) 
end 

и моя форма:

<%= f.collection_select(:prerequisite_ids, Lesson.all, :id, :name, {}, {:multiple => true}) %> 

UPDATE:

В журналах, я вижу:

"Lesson" => {"name" => «Урок 6», «high_tempo» => «200», «low_tempo» => «100», «interval» => «10», «advance_tempo» => «140», «prerequisite_ids» => [ "", "3", "4"]}, "совершить" => "Сохранить"} самовольных параметра: prerequisite_ids'`

ответ

0

похоже, есть несколько проблем здесь:

Одним из них является, что вы используете Prerequisite.new(...), когда я думаю, что вы хотите использовать Prerequisite.create(...)

Так что ваши создать действие должно быть:

def create 
    @lesson = Lesson.new(lesson_params) 

    if @lesson.save 
    if @lesson.prerequisite_ids.length > 0 
     @lesson.prerequisite_ids.each do |p| 
     Prerequisite.create(lesson_id: @lesson.id, prerequisite_lesson_id: p) 
     end 
    end 
    flash[:notice] = "Lesson created..." 
    redirect_to root_url 
    else 
    render :new 
    end 
end 

Другой это (из журналов):

"урок" => { "имя" => "Урок 6", "high_tempo" => "200", "low_tempo" => «100», «interval» => «10», «advance_tempo» => «140», «prerequisite_ids» => ["", "3", "4"]}, "commit" => " Сохранить "} самовольных параметра: prerequisite_ids'`

В контроллере, вы разрешаете

def lesson_params 
    params.require(:lesson).permit(
    :name, 
    :high_tempo, 
    :low_tempo, 
    :interval, 
    :advance_tempo, 
    prerequisites_attributes: [ 
     :lesson_id, 
     :prerequisite_lesson_id 
    ] 
) 
end 

Но обратите внимание, что реальные данные поступают в качестве "lesson" => {..., "prerequisite_ids"=>["", "3", "4"]}

Таким образом, вы должны вместо этого позволить, как это:

def lesson_params 
    params.require(:lesson).permit(
    :name, 
    :high_tempo, 
    :low_tempo, 
    :interval, 
    :advance_tempo, 
    prerequisite_ids: [] 
) 
end 

Кроме того, это выглядит как ваш prerequisite_ids включает значение, которое является пустой строкой.На основе this post, это выглядит, как вы, возможно, потребуется добавить к вашему include_hidden: true выберите тег, например:

<%= f.collection_select(:prerequisite_ids, Lesson.all, :id, :name, {}, {:multiple => true, include_hidden: true}) %> 
+0

Это то, что я вижу в журнале: «Параметры: {„utf8“=>» ✓ "," authenticity_token "=>" THaOnTF4jPv6duqqyxRMP7IIfpEPS9MrFJ5Ib50WohwyvP8dd085P0UQeD47jW2a65tI3eNeHVU0IZwL6hYpWw == "," lesson "=> {" name "=>" Lesson 6 "," high_tempo "=>" 200 "," low_tempo "=>" 100 "," interval "=>" 10 "," advance_tempo "=>" 140 "," prerequisite_ids "=> [" "," 3 "," 4 "]}," commit "=>" Save "} Параметр unpermitted: prerequisite_ids ' – AHinson

+0

Я обновил свой ответ, чтобы решить другую проблему, которую, я считаю, вы видите. – BananaNeil

+0

К сожалению, по-прежнему я получаю такую ​​же ошибку «Unpermitted parameter». – AHinson

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

  • Нет связанных вопросов^_^