Rails 对具有新父项和子项的表单进行模型验证
Rails model validation on form with new parent and child
我是 rails 的新手-但现在想知道,当我在表单中尝试同时创建子项和父项时,Rails 模型对象的验证是否丢失?
在我的示例中(粗体模型)
1 - 蛋糕 - has_many - 蛋糕详情
许多 - CakeDetails - belong_to 1 - 大小
1 - 蛋糕类型 - belongs_to 1 - 蛋糕
我已经成功地创建了一个表单,允许我创建一个蛋糕,指定尺寸、相关价格以及蛋糕的类型。
但似乎所有内置模型验证都消失了。
这是正确的吗?如何将验证带回我的模型对象?
当我呈现新操作时,我会弹出一个空白表单,当我提交一个空白表单时,我会得到以下信息:
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 %>
我的蛋糕模型
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
蛋糕控制器
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| %>
我会仔细阅读文档,但对于我为什么搞砸了的任何评论都非常感谢。刚开始学习这个框架... :/
根据 this article,我确信在其他地方,在 Rails 5 中,所有使用 form_with
创建的表单默认都是远程的(即提交为 js
).
通过将 local: true
添加到 form_with
,您强制表单以 html
提交,然后您的控制器使用 format.html
.
我以为我必须访问我在操作中声明的变量,例如
@蛋糕
但我更新了我的表格以使用它:
<%= form_with(model: cake, local: true) do |form| %>
而不是我认为我需要它的方式:
<%= form_with(model: @cake) do |form| %>
现在可以了。
特别感谢 jvillian 如此迅速的回复。
并注意到:
通过将 local: true
添加到 form_with
,您强制表单以 html
提交,然后您的控制器使用 format.html
.
我是 rails 的新手-但现在想知道,当我在表单中尝试同时创建子项和父项时,Rails 模型对象的验证是否丢失?
在我的示例中(粗体模型) 1 - 蛋糕 - has_many - 蛋糕详情
许多 - CakeDetails - belong_to 1 - 大小
1 - 蛋糕类型 - belongs_to 1 - 蛋糕
我已经成功地创建了一个表单,允许我创建一个蛋糕,指定尺寸、相关价格以及蛋糕的类型。
但似乎所有内置模型验证都消失了。
这是正确的吗?如何将验证带回我的模型对象?
当我呈现新操作时,我会弹出一个空白表单,当我提交一个空白表单时,我会得到以下信息:
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 %>
我的蛋糕模型
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
蛋糕控制器
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| %>
我会仔细阅读文档,但对于我为什么搞砸了的任何评论都非常感谢。刚开始学习这个框架... :/
根据 this article,我确信在其他地方,在 Rails 5 中,所有使用 form_with
创建的表单默认都是远程的(即提交为 js
).
通过将 local: true
添加到 form_with
,您强制表单以 html
提交,然后您的控制器使用 format.html
.
我以为我必须访问我在操作中声明的变量,例如
@蛋糕
但我更新了我的表格以使用它:
<%= form_with(model: cake, local: true) do |form| %>
而不是我认为我需要它的方式:
<%= form_with(model: @cake) do |form| %>
现在可以了。
特别感谢 jvillian 如此迅速的回复。
并注意到:
通过将 local: true
添加到 form_with
,您强制表单以 html
提交,然后您的控制器使用 format.html
.