为什么我的更新操作有效,而不是创建操作? Rails 4

时间:2014-05-31 06:09:12

标签: ruby-on-rails ruby ruby-on-rails-4

c在我的Rails 4应用程序中,我的更新操作正常,所以我可以编辑,但我的创建操作不是。我无法弄清楚为什么我可以在编辑表单中添加products_id和user_id,但是当我尝试使用创建新目录时,我会收到错误。

我的创作动作:

def create
 @catalogue = Catalogue.new(catalogue_params)
 if @catalogue.save
   redirect_to @catalogue, notice: "Catalogue was successfully created."
 else
   render action: "new"
 end
end

我的更新操作:

def update
 if @catalogue.update(catalogue_params)
   redirect_to @catalogue, notice: "Catalogue was successfully updated."
 else
   render action: "edit"
 end
end

我的强大参数:

private

 def set_catalogue
   @catalogue = Catalogue.find(params[:id])
 end

 def catalogue_params
   params.require(:catalogue).permit(:title, :url, :google_name, product_ids: [], user_ids: [])
end

从表格中:

忘记我的表单代码:

.field
  = f.collection_select(:user_ids, @catalogue.get_all_users, :id, :name, {}, multiple: true)
.field
  = f.label :product_ids
  = f.collection_select(:product_ids, @catalogue.get_all_products, :id, :title, {}, multiple: true)
.actions
= f.submit "Save"

不使用create的字段是数组:product_ids:[]和user_ids:[]。如果我点击我使用种子文件创建的其中一个目录,我可以打开它进行编辑,并从表单的下拉字段中添加产品或用户。目录更新,没问题。表单选择并将产品和用户作为数组发送。

但如果我点击新目录,我会收到此错误:

2 errors prohibited this catalogue from being saved:

  Catalogue users is invalid
  Catalogue products is invalid
--- !ruby/hash:ActionController::Parameters
utf8: "✓"
authenticity_token: ddJsIAweWHoblmbOAjoNpZ0iPwi8ookrgH6HOzd/jh4=
catalogue: !ruby/hash:ActionController::Parameters
  title: Testing Create
  url: www.something.com
  google_name: ''
  user_ids:
  - ''
  - '1'
 product_ids:
  - ''
 - '1'
commit: Save
action: create
controller: catalogue

我可以看到每个项目的选择都有,但没有名称,所以我不明白它为什么不创建,为什么如果我打开以前创建的目录,我可以通过表单添加产品和用户。但不是创造。

这来自控制台:

Processing by CatalogueController#create as HTML
Parameters: {"utf8"=>"✓",  "authenticity_token"=>"ddJsIAweWHoblmbOAjoNpZ0iPwi8ookrgH6HOzd/jh4=", "catalogue"=>{"title"=>"Testing Create", "url"=>"www.something.com", "google_name"=>"", "user_ids"=>["", "1"], "product_ids"=>["", "1"]}, "commit"=>"Save"}

我在用户和目录,产品和目录之间使用连接表:

class CatalogueProduct < ActiveRecord::Base
  belongs_to :catalogue
  belongs_to :product

  validates :product_id, :catalogue_id, presence: true
end

class Catalogue < ActiveRecord::Base
  include ModelHelper
  has_many :catalogue_users, dependent: :destroy
  has_many :users, through: :catalogue_users

  has_many :catalogue_products, dependent: :destroy
  has_many :products, through: :catalogue_products

用户模型遵循与上面相同的模式。

我想知道是否需要将这些数组转换为字符串?因为在上面它列出了实际的id。但是为什么更新操作不需要转换呢?我对正在发生的事情以及如何解决这个问题感到困惑。当我尝试在强参数中转换为字符串时,我一直收到错误。

谢谢!!!!!

2 个答案:

答案 0 :(得分:0)

问题在于:

2 errors prohibited this catalogue from being saved:

  Catalogue users is invalid
  Catalogue products is invalid

您的代码看起来不错

-

关联数据

我认为问题是您要为idsuser_ids传递多个product_ids。如果你有join models这些项目的任何内容,那么只有 的问题(因此Rails可以填充它们的集合对象)。

在不知道您的模型关联的情况下,我只能推测,但我会推测更改您的user_ids&amp; product_idsuser_id&amp; product_id应该解决问题(考虑到user_id表中有product_idcatalogues

.field
  = f.collection_select(:user_id, @catalogue.get_all_users, :id, :name, {}, multiple: true)
.field
  = f.label :product_ids
  = f.collection_select(:product_id, @catalogue.get_all_products, :id, :title, {}, multiple: true)
.actions
= f.submit "Save"

#app/controllers/home_controller.rb
def catalogue_params
   params.require(:catalogue).permit(:title, :url, :google_name, product_id, user_id)
end

-

<强>模型

考虑一下你的系统,我建议你对模型的结构有更深层次的问题。更具体地说,您希望将catalogue与多个产品相关联。多个用户?

如果是这种情况,我会按如下方式构建模型:

#app/models/catalogue.rb
has_and_belongs_to_many :products
has_and_belongs_to_many :users

#Tables:
#catalogues_users
#cataglogues_products

可让您将user_idsproduct_ids提交至Catalogue模型

答案 1 :(得分:0)

在创建操作中,在@catalogue=Catalogue.new(catalogue_params)之前,只需添加以下代码段:

params[:catalogue][:user_ids].delete('')
params[:catalogue][:product_ids].delete('')

这是因为您的表单为每个关联的模型(用户,产品)提交了一个空ID,这在尝试关联时当然无效。