Rails 5 没有使用 Cocoon gem 在 Ruby-on-Rails 中使用嵌套表单保存到我的 table
Rails 5 not saving to my table using nested forms in Ruby-on-Rails using Cocoon gem
RAILS 5 个问题。我有一个项目,我希望用户可以选择向表单添加额外的项目。我的代码正确呈现,并且 link 添加更多字段确实添加了更多文本字段。我遇到的问题是没有将 保存到我的数据库中。我在 MySQl 数据库上使用 mysql2 gem。我发布了控制台输出。这是我的:
forms_controller
# forms_controller.rb
def new
@form = Form.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @form }
end
end
def create
@form = Form.new(form_params)
respond_to do |format|
if @form.save
format.html { redirect_to(@form, :notice => 'form was successfully created.') }
format.xml { render :xml => @form, :status => :created, :location => @form }
else
format.html { render :action => "new" }
format.xml { render :xml => @form.errors, :status => :unprocessable_entity }
end
end
end
def form_params
params.require(:form).permit(:name, items_attributes: [:id, :item_name, :_destroy])
end
型号
# form.rb
class Form < ApplicationRecord
has_many :items
accepts_nested_attributes_for :items, reject_if: :all_blank, allow_destroy: true
validates_presence_of :name
end
# item.rb
class Item < ApplicationRecord
belongs_to :form
end
观看次数
<!-- _form.html.haml -->
= form_for @form do |f|
.field
= f.label :name
%br
= f.text_field :name
%h3 items
#items
= f.fields_for :items do |item|
= render 'item_fields', f: item
.links
= link_to_add_association 'add item', f, :items
= f.submit
.nested-fields
.field
= f.label :item_name
%br
= f.text_field :item_name
= link_to_remove_association "remove item", f
控制台
tarted POST "/forms" for 127.0.0.1 at 2016-09-08 23:04:17 -0600
Processing by FormsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"FmYPwlXy93iwBMkWvfyd3QJ+NKDcYnraUaKmMISbUIX3+KRL7KtpD33FW3CK+jxvn4AoUUMhx4zrGncJej5BOw==", "form"=>{"name"=>"sfsf", "items_attributes"=>{"1473397456358"=>{"item_name"=>"sfsf", "_destroy"=>"false"}}}, "commit"=>"Create Form"}
(0.2ms) BEGIN
(0.3ms) ROLLBACK
Rendering forms/new.html.haml within layouts/application
Rendered forms/_item_fields.html.haml (1.5ms)
Rendered forms/_item_fields.html.haml (1.2ms)
Rendered forms/_form.html.haml (8.5ms)
Rendered forms/new.html.haml within layouts/application (10.1ms)
Completed 200 OK in 68ms (Views: 54.5ms | ActiveRecord: 0.5ms)
在您的 permit/require 行中(在您的控制器中),item_attribute
可能应该是 item_attributes
(不止一个)即:
def form_params
params.require(:form).permit(:name, :date_sent, :quantity, :comment, item_attributes: [:id, :name, :form_id, :_destroy])
end
它不会保存的原因是因为我使用的是 Rails 5,我需要将 optional: true
添加到项目模型中的 belongs_to。
# form.rb
class Form < ApplicationRecord
has_many :items
accepts_nested_attributes_for :items, reject_if: :all_blank, allow_destroy: true
validates_presence_of :name
end
# item.rb
class Item < ApplicationRecord
belongs_to :form , optional: true
end
在Rails5中,每当我们定义一个belongs_to关联时,要求在本次更改后默认存在关联记录。
如果关联记录不存在,将触发验证错误。
class User < ApplicationRecord
end
class Post < ApplicationRecord
belongs_to :user
end
post = Post.create(title: 'Hi')
=> <Post id: nil, title: "Hi", user_id: nil, created_at: nil, updated_at: nil>
post.errors.full_messages.to_sentence
=> "User must exist"
****在 Rails 中选择退出此默认行为 5****
我们可以将 optional: true 传递给 belongs_to 关联,这将删除此验证检查。
class Post < ApplicationRecord
belongs_to :user, optional: true
end
post = Post.create(title: 'Hi')
=> <Post id: 2, title: "Hi", user_id: nil>
RAILS 5 个问题。我有一个项目,我希望用户可以选择向表单添加额外的项目。我的代码正确呈现,并且 link 添加更多字段确实添加了更多文本字段。我遇到的问题是没有将 保存到我的数据库中。我在 MySQl 数据库上使用 mysql2 gem。我发布了控制台输出。这是我的:
forms_controller
# forms_controller.rb
def new
@form = Form.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @form }
end
end
def create
@form = Form.new(form_params)
respond_to do |format|
if @form.save
format.html { redirect_to(@form, :notice => 'form was successfully created.') }
format.xml { render :xml => @form, :status => :created, :location => @form }
else
format.html { render :action => "new" }
format.xml { render :xml => @form.errors, :status => :unprocessable_entity }
end
end
end
def form_params
params.require(:form).permit(:name, items_attributes: [:id, :item_name, :_destroy])
end
型号
# form.rb
class Form < ApplicationRecord
has_many :items
accepts_nested_attributes_for :items, reject_if: :all_blank, allow_destroy: true
validates_presence_of :name
end
# item.rb
class Item < ApplicationRecord
belongs_to :form
end
观看次数
<!-- _form.html.haml -->
= form_for @form do |f|
.field
= f.label :name
%br
= f.text_field :name
%h3 items
#items
= f.fields_for :items do |item|
= render 'item_fields', f: item
.links
= link_to_add_association 'add item', f, :items
= f.submit
.nested-fields
.field
= f.label :item_name
%br
= f.text_field :item_name
= link_to_remove_association "remove item", f
控制台
tarted POST "/forms" for 127.0.0.1 at 2016-09-08 23:04:17 -0600
Processing by FormsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"FmYPwlXy93iwBMkWvfyd3QJ+NKDcYnraUaKmMISbUIX3+KRL7KtpD33FW3CK+jxvn4AoUUMhx4zrGncJej5BOw==", "form"=>{"name"=>"sfsf", "items_attributes"=>{"1473397456358"=>{"item_name"=>"sfsf", "_destroy"=>"false"}}}, "commit"=>"Create Form"}
(0.2ms) BEGIN
(0.3ms) ROLLBACK
Rendering forms/new.html.haml within layouts/application
Rendered forms/_item_fields.html.haml (1.5ms)
Rendered forms/_item_fields.html.haml (1.2ms)
Rendered forms/_form.html.haml (8.5ms)
Rendered forms/new.html.haml within layouts/application (10.1ms)
Completed 200 OK in 68ms (Views: 54.5ms | ActiveRecord: 0.5ms)
在您的 permit/require 行中(在您的控制器中),item_attribute
可能应该是 item_attributes
(不止一个)即:
def form_params
params.require(:form).permit(:name, :date_sent, :quantity, :comment, item_attributes: [:id, :name, :form_id, :_destroy])
end
它不会保存的原因是因为我使用的是 Rails 5,我需要将 optional: true
添加到项目模型中的 belongs_to。
# form.rb
class Form < ApplicationRecord
has_many :items
accepts_nested_attributes_for :items, reject_if: :all_blank, allow_destroy: true
validates_presence_of :name
end
# item.rb
class Item < ApplicationRecord
belongs_to :form , optional: true
end
在Rails5中,每当我们定义一个belongs_to关联时,要求在本次更改后默认存在关联记录。
如果关联记录不存在,将触发验证错误。
class User < ApplicationRecord
end
class Post < ApplicationRecord
belongs_to :user
end
post = Post.create(title: 'Hi')
=> <Post id: nil, title: "Hi", user_id: nil, created_at: nil, updated_at: nil>
post.errors.full_messages.to_sentence
=> "User must exist"
****在 Rails 中选择退出此默认行为 5****
我们可以将 optional: true 传递给 belongs_to 关联,这将删除此验证检查。
class Post < ApplicationRecord
belongs_to :user, optional: true
end
post = Post.create(title: 'Hi')
=> <Post id: 2, title: "Hi", user_id: nil>