【问题标题】:Rails nested form with collection_check_boxes带有 collection_check_boxes 的 Rails 嵌套表单
【发布时间】:2014-03-03 01:35:53
【问题描述】:

我有一个简单的应用程序,其中包含三个模型、类别、项目和分类:

class Category < ActiveRecord::Base
  has_many :categorizations, :dependent => :destroy
  has_many :projects, :through => :categorizations
end

class Project < ActiveRecord::Base
  has_many :categorizations, :dependent => :destroy
  has_many :categories, :through => :categorizations
  accepts_nested_attributes_for :categorizations
end

class Categorization < ActiveRecord::Base
  belongs_to :project
  belongs_to :category
end

我想使用一个表单来创建一个新项目并将类别与其关联。为分类模型传递数据的表单部分如下所示:

<div class="field">
  <strong>Categories:</strong><br>
    <%= f.fields_for :categorizations do |category| %>
      <%= collection_check_boxes :categorization, :category_ids, @categories, :id, :display_name %>
    <% end %>
</div>

...控制器的相关部分如下所示:

def create
    @project = Project.new(project_params)
    @categorizations = @project.categorizations.build(categorization_params)

    respond_to do |format|
      if @project.save && @categorizations.save
        format.html { redirect_to @project, notice: 'Project was successfully created.' }
        format.json { render action: 'show', status: :created, location: @project }
      else
        format.html { render action: 'new' }
        format.json { render json: @project.errors, status: :unprocessable_entity }
      end
    end
  end

def categorization_params
  params.require(:project).permit(:project_ids => [], :category_ids => [])
end

当我尝试使用此表单创建新记录时,它成功创建了一个新项目记录,但分类记录没有通过 category_ids。当我查看日志时,它似乎将 category_ids 作为字符串数组传递:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"zt3KGmB20OA28P7Y21QvYjTkJvJg+gQnjOcp//XNB2I=", "project"=>{"slug"=>"new-project-31", "title"=>"New Project 31", "body"=>"Design & research", "published"=>"false"}, "categorization"=>{"category_ids"=>["1", "2", ""]}, "commit"=>"Create Project"}

INSERT INTO "categorizations" ("created_at", "project_id", "updated_at") VALUES (?, ?, ?)  [["created_at", Mon, 03 Mar 2014 00:36:09 UTC +00:00], ["project_id", 27], ["updated_at", Mon, 03 Mar 2014 00:36:09 UTC +00:00]]

任何帮助弄清楚如何从表单创建单独的分类记录将不胜感激!

【问题讨论】:

    标签: ruby-on-rails arrays activerecord nested-forms


    【解决方案1】:

    我不太确定这是否会起作用,因为您没有显示错误消息。但我猜这是因为您没有向构建方法提交正确的参数。

    尝试将数组映射到类似于

    的散列

    ...构建(categorization_params.map{|cat| cat})

    编辑:

    讨论后:

    @project.categorizations.build(params[:categorization][:category_id].map{|cat| {category_id: cat}}
    

    【讨论】:

    • 我实际上没有收到错误 - 它只是创建一个新的分类记录(没有任何 category_ids),而不是创建多个新的分类记录,每个提交的 category_id 一个。看起来它通过 categorization_params 作为哈希传递它,它只是不使用它们来创建记录。
    • 不管怎样,分类只包含 project_id 和 category_id。
    • 当我添加映射时,它会尝试将@categorizations 保存为一个数组,但该数组为空白 ([])。
    • 您可能需要映射正确的参数,而不是通过强参数验证的 categorization_params。这可能就是问题所在。
    • 我现在不在com,但是您可以通过打印参数并获取要转换为哈希的特定数组来弄清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多