我有一些正在处理的Rails 4项目的代码。它使用active_record(mysql2),并且has_many :through
当我进行交互时rails c
(在生产或开发中),有一种关系可以正常工作。当我尝试以表单形式提交关系时(我正在使用simple_form),我似乎无法保存它。
这是我目前的信息设置方式(仅显示摘要,我无法真正显示全部源代码):
has_many :categorizations
has_many :resource_categories, through: :categorizations
accepts_nested_attributes_for :resource_categories
accepts_nested_attributes_for :categorizations
= simple_form_for @resource do |f|
= f.association :resource_categories
# POST /resources
# POST /resources.json
def create
@resource = Resource.new(resource_params)
set_categories(@resource, params[:resource][:resource_category_ids])
respond_to do |format|
if @resource.save
format.html {
redirect_to @resource, notice: 'Resource was successfully created.'
}
format.json {
render action: 'show', status: :created, location: @resource
}
else
format.html {
render action: 'new'
}
format.json {
render json: @resource.errors, status: :unprocessable_entity
}
end
end
end
# PATCH/PUT /resources/1
# PATCH/PUT /resources/1.json
def update
respond_to do |format|
if @resource.update(resource_params)
set_categories(@resource, params[:resource][:resource_category_ids])
format.html {
redirect_to @resource, notice: 'Resource was successfully updated.'
}
format.json {
head :no_content
}
else
format.html {
render action: 'edit'
}
format.json {
render json: @resource.errors, status: :unprocessable_entity
}
end
end
end
# Never trust parameters from the scary internet, only allow the white list
# through.
def resource_params
params.require(:resource).permit(
:title, :slug, :ancestry, :status, :author_id, :published, :parent_id,
:resource_category_ids, :preview, :body
)
end
def set_categories(resource, categories)
# Clean out the existing categories (if there are any)
unless resource.resource_categories.blank?
resource.resource_categories.each do |category|
resource.resource_categories.delete(category)
end
end
unless categories.blank?
categories.each do |category|
unless category.blank?
resource.resource_categories << ResourceCategory.find(category)
end
end
end
end
当我使用rails c -e production
(或仅使用rails c
)发出以下命令时,它可以工作(在本示例中,我将所有类别分配给所有资源):
Resource.all.each do |resource|
ResourceCategory.all.each do |category|
resource.resource_categories << category
end
end
看来我的问题是控制器未调用辅助函数
改用这个:
def create
@resource = Resource.new(resource_params)
@resource.set_categories(params[:resource][:resource_category_ids])
..
end
在Resource
模型中移动方法:
def set_categories(categories)
# Clean out the existing categories (if there are any)
unless new_record?
unless resource_categories.blank?
resource_categories.each do |category|
resource_categories.delete(category)
end
end
end
unless categories.blank?
categories.each do |category|
unless category.blank?
resource_categories << ResourceCategory.find(category)
end
end
end
end
@resource
是Controller的实例变量,则无需将其传递给方法。直接在实例变量上执行所有操作。
OP仍然有问题,同时保存记录,改:resource_category_ids
以:resource_category_ids => []
在resource_params
方法:
def resource_params
params.require(:resource).permit(
:title, :slug, :ancestry, :status, :author_id, :published, :parent_id,
:preview, :body, :resource_category_ids => []
)
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句