Проверка модели Rails на форме с новым родителем и потомком - PullRequest
0 голосов
/ 25 апреля 2018

Я новичок в rails - но теперь интересно, теряются ли проверки Rails на объектах модели, когда в моей форме я пытаюсь одновременно создать дочерний и родительский элементы?

В моем примере(модели выделены жирным шрифтом) 1 - Cake - has_many - CakeDetails

много - CakeDetails - принадлежат_1 - Размер

1 - CakeType - принадлежит_в 1 - Cake

Мне удалось создать форму, позволяющую мне создать Cake, указатьразмеры, связанные цены и тип торта.

Но кажется, что все встроенные проверки моделей пропали.

Это правильно?Как вернуть проверку объектам моей модели?

Когда я отображаю новое действие, у меня появляется пустая форма, и когда я отправляю пустую форму, я получаю следующее:

Started POST "/cakes" for 127.0.0.1 at 2018-04-25 21:19:03 +0100
Processing by CakesController#create as JS
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"r6B2ult7w7z4vez95f2pNXmk7Q1rYSzj8Wi9VwnS4EgIAw8PG/w7isfAeiiSB9sY8+0+oHldMVpy1GFKBmrpmw==", "cake"=>{"name"=>"", "description"=>"", "cake_type_id"=>"", "cake_details_attributes"=>{"0"=>{"_destroy"=>"true", "price"=>""}, "1"=>{"_destroy"=>"true", "price"=>""}}}, "commit"=>"Create Cake"}
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
  Rendering cakes/new.html.erb within layouts/application
  CakeType Load (0.3ms)  SELECT "cake_types".* FROM "cake_types"
  Rendered cakes/_form.html.erb (15.9ms)
  Rendered cakes/new.html.erb within layouts/application (19.6ms)
Completed 200 OK in 109ms (Views: 100.4ms | ActiveRecord: 0.5ms)

Я получаю, что это откат транзакции, потому что нет cake_type_id.Но ошибки не отображаются.

Ниже приведен раздел отображения ошибок в моей форме.Я попытался добавить еще, чтобы проверить наличие ошибок во вложенном объекте, но ничего не увидел.

  <% if @cake.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(cake.errors.count, "error") %> prohibited this cake from being saved:</h2>
      <ul>
      <% @cake.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <% @cake.cake_details.each do |detail| %>
    <% if detail.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(cake.errors.count, "error") %> prohibited this cake from being saved:</h2>
      <ul>
      <% @cake.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
    <% end %>
  <% end %>

Модель My Cake

class Cake < ApplicationRecord
  validates :name, :description, :cake_type, presence: true

  belongs_to :cake_type
  has_many :cake_details, -> {order('size_id ASC')}, inverse_of: :cake
  has_many :sizes, through: :cake_details
  accepts_nested_attributes_for :cake_details, :allow_destroy => true

  validates_associated  :cake_type, :cake_details
end

Контроллер Cakes

  def create
    #@cake = Cake.new(params[cake:{}])
    #params.require(:cake).permit(:name, :description,:cake_type_id)

    @cake = Cake.new(cake_params)
    respond_to do |format|
      if @cake.save
        format.html { redirect_to @cake, notice: 'Cake was successfully created.' }
        format.json { render :show, status: :created, location: @cake }
      else
        format.html { render :new }
        format.json { render json: @cake.errors, status: :unprocessable_entity }
      end
    end
  end

def cake_only_params
  params.require(:cake).permit(:name, :description,:cake_type_id)
end

def cake_params
  params.require(:cake).permit(:name, :description,:cake_type_id, cake_type_id:[:type_id],
  cake_details_attributes:[:_destroy, :id, :cake_id, :size_id, :price])
end

ОБНОВЛЕНИЕ

Я думал, что должен получить доступ к переменной, которую я объявил в своем действии, например, @cake, но я обновил свою форму, чтобы использовать это

<%= form_with(model: cake, local: true) do |form| %>

вместо того, какЯ думал, что мне это нужно:

<%= form_with(model: @cake) do |form| %>

Я прочитаю документы, но любые комментарии о том, почему я это испортил, определенно приветствуются.Просто начинаю изучать этот фреймворк ...: /

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Я думал, что должен получить доступ к переменной, которую я объявил в своем действии, например,

@ cake

, но я обновил свою форму, чтобы использовать это:

<%= form_with(model: cake, local: true) do |form| %>

о том, как я думал, что мне это нужно:

<%= form_with(model: @cake) do |form| %>

, и теперь это работает.

Особая благодарность jvillian за столь быстрый ответ.

И, отметив, что:

Добавляя local: true к form_with, вы заставляете форму отправлять как html, и ваш контроллер затем использует format.html.

0 голосов
/ 26 апреля 2018

Согласно этой статье , и я уверен, что в Rails 5 все формы, созданные с помощью form_with, по умолчанию являются удаленными (т. Е. Отправляются как js).

Добавляя local: true к form_with, вы заставляете форму отправлять как html, и ваш контроллер затем использует format.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...