如果选中复选框,则拒绝创建嵌套属性

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] 是决定您是否要创建模板的复选框的参数