Ruby on rails 4 Rails 4嵌套表单不创建其接受\u嵌套属性\u的对象
我正在努力使类别和子类别发挥作用。到目前为止,我可以创建类别并向其中添加子类别。提交表单时,会发送子类别属性,但不会创建子类别记录。请帮帮我,我在这里忙得不可开交,而所有的教程似乎都帮不上忙 category.rbRuby on rails 4 Rails 4嵌套表单不创建其接受\u嵌套属性\u的对象,ruby-on-rails-4,parameters,nested-forms,nested-attributes,Ruby On Rails 4,Parameters,Nested Forms,Nested Attributes,我正在努力使类别和子类别发挥作用。到目前为止,我可以创建类别并向其中添加子类别。提交表单时,会发送子类别属性,但不会创建子类别记录。请帮帮我,我在这里忙得不可开交,而所有的教程似乎都帮不上忙 category.rb class Category < ActiveRecord::Base has_many :subcategories, :dependent => :destroy accepts_nested_attributes_for :subcategories,
class Category < ActiveRecord::Base
has_many :subcategories, :dependent => :destroy
accepts_nested_attributes_for :subcategories, :reject_if => lambda {|a|
a[:content].blank?}
end
class Subcategory < ActiveRecord::Base
belongs_to :category
end
class CategoriesController < ApplicationController
before_action :set_category, only: [:show, :edit, :update, :destroy]
def index
@categories = Category.all
end
def show
end
def new
@category = Category.new
@category.subcategories.build
end
def edit
end
def create
@category = Category.new(category_params)
respond_to do |format|
if @category.save
format.html { redirect_to @category, notice: 'Category was successfully
created.' }
format.json { render action: 'show', status: :created, location: @category }
else
format.html { render action: 'new' }
format.json { render json: @category.errors, status: :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if @category.update(category_params)
format.html { redirect_to @category, notice: 'Category was successfully
updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @category.errors, status: :unprocessable_entity }
end
end
end
def destroy
@category.destroy
respond_to do |format|
format.html { redirect_to categories_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_category
@category = Category.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def category_params
params.require(:category).permit(:name, subcategories_attributes: [:id, :name,
:_destroy])
end
end
<%= nested_form_for(@category) do |f| %>
<% if @category.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@category.errors.count, "error") %> prohibited this category
from being saved:</h2>
<ul>
<% @category.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<%f.fields_for :subcategories do |builder|%>
<p>
<b>Subcategory</b>
<%=builder.text_field :name%>
<%=builder.link_to_remove "Remove"%>
<p>
<%end%>
<p>
<%=f.link_to_add "Add a Subcategory", :subcategories%>
</p>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
提前谢谢
子类别\u属性
在参数
散列中正确发送,但其中缺少内容
属性
"subcategories_attributes"=>{"1398706662184"=>{"name"=>"TS1",
"_destroy"=>"false"}, "1398706664804"=>{"name"=>"TS2", "_destroy"=>"false"}}
请注意,没有传递内容
键。
因此,由于在类别
模型中指定的条件,在子类别_属性
中传递的所有子类别记录都被拒绝:
accepts_nested_attributes_for :subcategories, :reject_if => lambda {|a|
a[:content].blank?}
注意:reject_if=>lambda{a | a[:content]。blank?}
上面的部分,这将拒绝缺少content
的所有记录
更新
当我转到编辑操作时,这些字段不会显示,尽管它们按预期添加到数据库中(并在其他操作中显示)
表格)
在edit
和new
操作中设置变量,如下所示:
def new
@category = Category.new
@subcategories = @category.subcategories.build ## Added
end
def edit
@subcategories = @category.subcategories ## Added
end
<%= f.fields_for :subcategories, @subcategories do |builder|%>
更新edit
表单中的字段,如下所示:
def new
@category = Category.new
@subcategories = @category.subcategories.build ## Added
end
def edit
@subcategories = @category.subcategories ## Added
end
<%= f.fields_for :subcategories, @subcategories do |builder|%>
那么我应该使用lambda{a | a[:name].blank吗?}?我对lambdas很陌生,不确定:内容是否是“这里的东西”的内置符号。是的,你可以。这只是对另一个属性的检查。当您传递:子类别属性中子类别的name
字段时,它将解决您的问题<代码>子类别
将成功保存。这就解决了它!谢谢还有一个问题——当我转到编辑操作时,字段不会显示,尽管它们按预期添加到数据库中(并以其他形式显示)。我希望能够删除子类别,如果必要的话,从编辑行动。对不起,如果我是一个麻烦…请参阅更新部分的答案。