Rails 4 вложенных атрибута с simple_fields_for одно сохраняет и один не сохраняет в базу данных

Исследование: [Вложенные атрибуты Rails 4 с полями_ для не сохранения в базу данных] [Rails 4 - вложенные атрибуты с драгоценным камнем Cocoon] 1 [Вложенные атрибуты и поля Rails 4.1 для получения недопустимых параметров без сохранения] 2

Моя конкретная проблема:

У меня есть две вложенные формы: ингредиенты и направления

Ингредиенты сохраняются, но указания не сохраняются. Это не вызывает ошибки, и журналы не содержат подсказки относительно того, есть ли проблема.

Во-первых, давайте решим наиболее частую проблему: неверно названные параметры атрибутов для строгих параметров. Мое правильно множественное число.

class RecipesController < ApplicationController
def recipe_params
        params.require(:recipe).permit(:title, :image, directions_attributes: [:id, :name, :_destroy], ingredients_attributes: [:id, :name, :_destroy])
    end

И мои модели тоже настроены правильно

class Recipe < ActiveRecord::Base
    has_many :ingredients
    has_many :directions
    belongs_to :user
    accepts_nested_attributes_for :ingredients, reject_if: :all_blank, allow_destroy: true
    accepts_nested_attributes_for :directions, reject_if: :all_blank, allow_destroy: true
    validates :title, presence: true
    mount_uploader :image, ImageUploader
end

#_form.html.haml
= simple_form_for @recipe, html: { multipart: true } do |f|
    - if @recipe.errors.any?
        #errors
            %p
                = @recipe.error.count
                Prevented this recipe from saving
            %ul
                %li= msg
    .panel-body
        = f.input :title, label: "Name", input_html: { class: 'form-control' }
        = f.input :image, label: "Picture",input_html: { class: 'form-control' }
        .row
            .col-md-6
                %h3 Ingredients
                #ingredients
                    = f.simple_fields_for :ingredients do |ingredient|
                        = render 'ingredient_fields', f: ingredient
                    .links
                        = link_to_add_association 'Add Ingredient', f, :ingredients, class: "btn btn-default add-button"

            .col-md-6
                %h3 Directions
                #directions
                    = f.simple_fields_for :directions do |direction|
                        = render 'direction_fields', f: direction
                    .links
                        = link_to_add_association 'Add Step', f, :directions, class: "btn btn-default add-button"

    = f.button :submit, class: "btn btn-primary"

Here are both my partials for ingredients and directions

_ingredient_fields.html.haml
.form-inline.clearfix
    .nested-fields
        = f.input :name, input_html: { class: "form-input form-control"}
        = link_to_remove_association 'Remove', f, class: "form-button btn btn-default"

_direction_fields.html.haml
.form-inline.clearfix
    .nested-fields
        = f.input :name, input_html: { class: "form-input form-control"}
        = link_to_remove_association 'Remove', f, class: "form-button btn btn-default"

Ok here is the funny thing, my app doesn't throw any errors. The name, image and ingredients save but the directions do not.

Вот журнал

Запущен POST "/ recipes" для :: 1 в 2016-02-12 19:00:07 -0800 Обработка RecipesController # create as HTML Параметры: {"utf8" => "✓", "Authentity_token" => "YEXiv10mHkfdLPRFGHFGNJX2szJQVXK7gezeakEFbe + 57afx6Ih1UjRS6tJNftDLsMI5NS1W84pf2sRhQi0J8g == "," recipe "=> {" title "=>" Цыпленок с медом и яблоком "," image "=> #, @ original_filename =" Honey-Mustard-Chicken-and-Apples.jpg ", @ content_type image / jpeg ", @ headers =" Content-Disposition: form-data; name = \ "recipe [image] \"; filename = \ "Медово-горчичный-Цыпленок-и-Яблоки.jpg \" \ r \ nContent- Введите: image / jpeg \ r \ n ">," inventory_attributes "=> {" 1455332308170 "=> {" name "=>" Куриные бедра "," _destroy "=>" false "}," 1455332308175 "=> { "name" => "Мед", "_destroy" => "false"}}, "direction_attributes" => {"1455332325877" => {"step" => "Коричневый цыпленок с кожей.", "_destroy" = > "false"}, "1455332325880" => {"step" => "Добавить яблоки", "_destroy" => "false"}}}, "commit" => "Создать рецепт"} Загрузка пользователя (0,1 мс) ВЫБЕРИТЕ «пользователей». * ИЗ «пользователей» ГДЕ «пользователи». «Id» =? ORDER BY "users". "Id" ASC LIMIT 1 [["id", 1]] Недопустимый параметр: шаг Недопустимый параметр: шаг (0,1 мс) начало транзакции Рецепт существует (0,2 мс) ВЫБРАТЬ 1 КАК ОДИН ИЗ "рецептов" ГДЕ "рецепты". "Image" =? LIMIT 1 [["image", "1455332407-84040-0233 / Honey-Mustard-Chicken-and-Apples.jpg"]] SQL (0,4 мс) INSERT INTO "recipes" ("title", "image", "user_id" "," created_at "," updated_at ") ЗНАЧЕНИЯ (?,?,?,?,?) [[" title "," Honey Apple Chicken "], [" image "," 1455332407-84040-0233 / Honey-Mustard -Chicken-and-Apples.jpg "], [" user_id ", 1], [" created_at "," 2016-02-13 03: 00: 07.756946 "], [" updated_at "," 2016-02-13 03 : 00: 07.756946 "]] SQL (0,2 мс) ВСТАВИТЬ" ингредиенты "(" имя "," recipe_id "," created_at "," updated_at ") VALUES (?,?,?,?) [[" Name ", «Куриные бедра»], [«recipe_id», 1], [«created_at», «2016-02-13 03: 00: 07.758440»], [«updated_at», «2016-02-13 03: 00: 07.758440» ]] SQL (0,1 мс) ВСТАВИТЬ В "ингредиенты" ("имя", "recipe_id", "created_at", "updated_at") VALUES (?,?,?,?) [["Name", "Honey"], ["recipe_id", 1], ["created_at", "2016-02-13 03: 00: 07.759655"], ["updated_at", "2016-02-13 03: 00: 07.759655"]] (2,5 мс) совершить транзакцию Перенаправлено на http://localhost:3000/recipes/1 Завершено 302 Найдено за 1499 мс (ActiveRecord: 3,5 мс)

Начат GET "/ recipes / 1" для :: 1 в 2016-02-12 19:00:09 -0800 Обработка RecipesController # показать как параметры HTML: {"id" => "1"} Загрузка рецепта (0,3 мс) ВЫБЕРИТЕ "рецепты". * ИЗ "recipes" ГДЕ "recipes". "Id" =? LIMIT 1 [["id", 1]] Пользовательская нагрузка (0,2 мс) ВЫБЕРИТЕ "users". * FROM "users" ГДЕ "пользователи". "Id" =? LIMIT 1 [["id", 1]] Загрузка ингредиентов (0,3 мс) ВЫБЕРИТЕ «ингредиенты». * ИЗ «ингредиентов» ГДЕ «ингредиенты». «Recipe_id» =? [["recipe_id", 1]] Направление нагрузки (0,1 мс) ВЫБЕРИТЕ "направления". * ОТ "направления" ГДЕ "направления". "recipe_id" =? [["recipe_id", 1]] Пользовательская нагрузка (0,1 мс) ВЫБЕРИТЕ "пользователей". * ИЗ "пользователей" ГДЕ "пользователи". "id" =? ORDER BY "users". "Id" ASC LIMIT 1 [["id", 1]] Обработанные рецепты / show.html.haml в макетах / приложении (9,2 мс) Завершено 200 OK за 47 мс (Просмотры: 41,2 мс | ActiveRecord: 1.0 мс)

Я не понимаю ответа Карла на его собственный вопрос: Вложенные атрибуты и поля Rails 4.1 для получения недопустимых параметров без сохранения Если вы что-то видите, значит, вы Макгивер!


person kenyacode    schedule 13.02.2016    source источник
comment
Ответ Карла не имеет отношения: он сам манипулирует javascript / html. Ответ @ elias-sanchez мне кажется правильным: вы не разрешаете step в своих сильных параметрах, и это, скорее всего, приведет к отклонению моделей (и тогда он выйдет из строя без ошибок). Но сложно сказать наверняка без кода модели для ваших рецептов.   -  person nathanvda    schedule 14.02.2016


Ответы (1)


Ты можешь измениться:

params.require(:recipe).permit(:title, :image, directions_attributes: [:id, :name, :_destroy], ingredients_attributes: [:id, :name, :_destroy])

для

params.require(:recipe).permit(:title, :image, directions_attributes: [:id, :name, :step, :_destroy], ingredients_attributes: [:id, :name, :_destroy])

вы пытаетесь отправить "step", когда это не разрешено, если у вас есть проверка not_blank в вашей модели Direction для столбца setp, он не будет сохранен.

person Elias Sanchez    schedule 14.02.2016