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。但是为什么更新操作不需要转换呢?我对正在发生的事情以及如何解决这个问题感到困惑。当我尝试在强参数中转换为字符串时,我一直收到错误。
谢谢!!!!!
答案 0 :(得分:0)
问题在于:
2 errors prohibited this catalogue from being saved:
Catalogue users is invalid
Catalogue products is invalid
您的代码看起来不错
-
关联数据
我认为问题是您要为ids
和user_ids
传递多个product_ids
。如果你有join models
这些项目的任何内容,那么只有 的问题(因此Rails可以填充它们的集合对象)。
在不知道您的模型关联的情况下,我只能推测,但我会推测更改您的user_ids
&amp; product_ids
至user_id
&amp; product_id
应该解决问题(考虑到user_id
表中有product_id
和catalogues
列
.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_ids
和product_ids
提交至Catalogue
模型
答案 1 :(得分:0)
在创建操作中,在@catalogue=Catalogue.new(catalogue_params)
之前,只需添加以下代码段:
params[:catalogue][:user_ids].delete('')
params[:catalogue][:product_ids].delete('')
这是因为您的表单为每个关联的模型(用户,产品)提交了一个空ID,这在尝试关联时当然无效。