如果选中复选框,则拒绝创建嵌套属性
Reject creation of nested attribute if checkbox checked
我的 rails 应用程序中有一个接受嵌套属性的表单。但是,我想要做的是 rails 在选中复选框(在模型本身之外)时拒绝创建嵌套模型。
知道如何从控制器将属性传递给模型中 accepts_nested_attributes_for 的 :reject_if 选项吗?
非常感谢您。
编辑:
我的控制器是这样的:
def new
@course = Course.new
@course.course_template = CourseTemplate.new
end
def create
@course = Course.new(course_params)
@course.user = current_user
if @course.save
flash[:success] = t(".new_course_created_succefully")
redirect_to courses_path
else
render 'new'
end
end
和表格:
<%= form_for @course do |f| %>
<%= render 'shared/error_messages', error_model: @course %>
<div class="form-group has-feedback mb">
<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>
</div>
<div class="form-group has-feedback mb">
<div class="checkbox c-checkbox needsclick">
<label class="needsclick">
<%= check_box_tag "template", "1", false, {class: "needsclick"} %>
<span class="fa fa-check"></span>Is Template?
</label>
</div>
</div>
<%= f.fields_for :course_template do |ff| %>
<div class="form-group has-feedback mb">
<%= ff.label :name %>
<%= ff.text_field :name %>
</div>
<% end %>
<% end %>
将该复选框作为参数从表单发送,并将 build
操作放在 if 语句中。无需为 reject_if
而烦恼
您需要分别处理创建和构建操作。因此,您不会向模型传递所有属性,而是向模型传递模型属性、关联、嵌套属性
# controller
course = Course.new(course_params.reject{|attrib| attrib == :course_template_attributes})
unless params[:skip_create]
course.course_templates.build(course_params[:course_template_attributes]
end
...
您需要做的是有条件地创建 course_templates,这样您就可以传递 Course.new
所有 course_params
,因为这会同时创建课程和模板,这需要分开做。
请注意,我对上面的 reject
声明进行了简写。您可以手动添加各种参数,或者更好地创建另一个具有强参数的方法,并将模型属性列入白名单(不包括 course_template_attributes)
另外。 params[:skip_create]
是决定您是否要创建模板的复选框的参数
我的 rails 应用程序中有一个接受嵌套属性的表单。但是,我想要做的是 rails 在选中复选框(在模型本身之外)时拒绝创建嵌套模型。
知道如何从控制器将属性传递给模型中 accepts_nested_attributes_for 的 :reject_if 选项吗?
非常感谢您。
编辑:
我的控制器是这样的:
def new
@course = Course.new
@course.course_template = CourseTemplate.new
end
def create
@course = Course.new(course_params)
@course.user = current_user
if @course.save
flash[:success] = t(".new_course_created_succefully")
redirect_to courses_path
else
render 'new'
end
end
和表格:
<%= form_for @course do |f| %>
<%= render 'shared/error_messages', error_model: @course %>
<div class="form-group has-feedback mb">
<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>
</div>
<div class="form-group has-feedback mb">
<div class="checkbox c-checkbox needsclick">
<label class="needsclick">
<%= check_box_tag "template", "1", false, {class: "needsclick"} %>
<span class="fa fa-check"></span>Is Template?
</label>
</div>
</div>
<%= f.fields_for :course_template do |ff| %>
<div class="form-group has-feedback mb">
<%= ff.label :name %>
<%= ff.text_field :name %>
</div>
<% end %>
<% end %>
将该复选框作为参数从表单发送,并将 build
操作放在 if 语句中。无需为 reject_if
而烦恼
您需要分别处理创建和构建操作。因此,您不会向模型传递所有属性,而是向模型传递模型属性、关联、嵌套属性
# controller
course = Course.new(course_params.reject{|attrib| attrib == :course_template_attributes})
unless params[:skip_create]
course.course_templates.build(course_params[:course_template_attributes]
end
...
您需要做的是有条件地创建 course_templates,这样您就可以传递 Course.new
所有 course_params
,因为这会同时创建课程和模板,这需要分开做。
请注意,我对上面的 reject
声明进行了简写。您可以手动添加各种参数,或者更好地创建另一个具有强参数的方法,并将模型属性列入白名单(不包括 course_template_attributes)
另外。 params[:skip_create]
是决定您是否要创建模板的复选框的参数