我在几个控制器中出现了类似的(重复的?)代码。有时它在#update
行动中,有时它在一个#update_multiple
行动中……有时它在两者中。
在所有情况下,主要目的是设置belongs_to
关系的代码,因此有效地仅在控制器的模型上设置 product_id。它使用first_or_create
所以如果引用Product
不存在则首先创建它。
重复代码:
product = Product.where(params[:product]).first_or_create if params[:product]
if product && params[:project][:code].present?
project = Project.where(params[:project]).first_or_create
product.project = project if project
end
product.save if product
快速概览或关系:_Items & _Files belong_to
a Product。产品可以belong_to
是一个项目。
我可以/应该把它提取到哪里?我不确定它是否应该进入产品(和项目)模型?或者也许在 ApplicationController 中?还是帮手?
以下是'wild'中代码的一些示例:
#disk_files_controller.rb
...
def update
product = Product.where(params[:product]).first_or_create if params[:product]
if product && params[:project][:code].present?
project = Project.where(params[:project]).first_or_create
product.project = project if project
end
product.save if product
respond_to do |format|
if @disk_file.update(disk_file_params)
format.html { redirect_to @disk_file, notice: 'Disk_File was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @disk_file.errors, status: :unprocessable_entity }
end
end
end
update_multiple 示例
#inventory_items_controller.rb
...
def update_multiple
product = Product.where(params[:product]).first_or_create if params[:product]
if product && params[:project][:code].present?
project = Project.where(params[:project]).first_or_create
product.project = project if project
end
product.save if product
@inventory_items = InventoryItem.find(params[:inventory_item_ids])
update_hash = {product_id: product.id}
update_hash.merge({project_code: params[:project][:code]}) unless params[:project][:code].blank?
InventoryItem.update_all(update_hash, {id: params[:inventory_item_ids]})
redirect_to inventory_items_url
end
...