Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 有很多:通过赢得';t保存到数据库_Ruby On Rails_Has Many Through_Categorization - Fatal编程技术网

Ruby on rails 有很多:通过赢得';t保存到数据库

Ruby on rails 有很多:通过赢得';t保存到数据库,ruby-on-rails,has-many-through,categorization,Ruby On Rails,Has Many Through,Categorization,我通过分类建立了项目和类别的关联: class Item < ActiveRecord::Base has_many :categorizations has_many :categories, :through => :categorizations, :source => :category end class Category < ActiveRecord::Base has_many :categorizations has_many :ite

我通过分类建立了项目和类别的关联:

class Item < ActiveRecord::Base
  has_many :categorizations
  has_many :categories, :through => :categorizations, :source => :category
end


class Category < ActiveRecord::Base
  has_many :categorizations
  has_many :items, :through => :categorizations, :source => :item
  attr_accessible :name
end

class Categorization < ActiveRecord::Base
  belongs_to :item
  belongs_to :category
end
问题是,当我点击save(创建项)并检查分类表和控制台上的时,保存的项仍然没有category_id。 因此,新项目及其属性(名称、说明、价格)将正确保存到DB,而不是类别。它不会保存到db

有什么想法吗?(铁路新手)
感谢

表单发布到ItemsController#create,并且没有调用CategorizationsController#create(您可以通过一些验证)

您可以使用的接受_嵌套_属性_,让项目的创建操作完成所有工作。诀窍是只创建复选框的类别关联,您可以使用
:reject_if
选项():

app/models/item.rb:

class Item < ActiveRecord::Base
  has_many :categorizations
  has_many :categories, :through => :categorizations, :source => :category
  accepts_nested_attributes_for :categories, 
                                :reject_if => proc{|c| c[:persist].blank?}
end

参数
放入控制器操作中会很有教育意义,这样您就可以看到从表单发送的哈希值是什么样子的。

您的控制器的创建操作是什么样子的?您好@rkb,刚刚通过添加控制器进行了编辑。我希望它能帮助我解决这个问题。哇,谢谢@rkb,通过阅读API和相关内容,我仍在试图理解你的解释。再次感谢,我会尽快回来。这仍然是一个最新的解决方案吗?我得到的“persist”方法不存在。
class CategorizationsController < ApplicationController
   def create
     @categories = Category.all
     Categorization.create(:item_id => item.id, :category_id => category.id)
     Categorization.save
   end

  def edit
  end

end
def create
    @item = @current_user.items.build(params[:item])
    @categories = Category.all
    if @item.save
      redirect_to @item
    else
      render 'new'
    end
 end
class Item < ActiveRecord::Base
  has_many :categorizations
  has_many :categories, :through => :categorizations, :source => :category
  accepts_nested_attributes_for :categories, 
                                :reject_if => proc{|c| c[:persist].blank?}
end
<%= form_for @item do |f| %>
  <%# stuff to generate item fields... %>

  <%= f.fields_for :categories do |cat| %>
    <%= cat.check_box :persist %>
    <%= cat.label :name, cat.name %>
  <%- end %>

  <%# submit button, etc. %>
<%- end %>
def new  
  @item = Item.new  
  Category.all.each {|cat| @item.categories.build(cat.attributes) }  
end