我有一个使用Rails 4.4的网站,用户可以在其中展示他们的房产出售。用户通过注册和上传来提供其属性的数据和图片,然后管理员验证数据并询问用户我们是否可以在批准数据并使其生效之前使数据生效。
我想允许用户返回并编辑或添加新数据。例如,用户可能想要添加新图片或更新其媒体资源的地址。
如何使用户能够在不实际上线的情况下编辑实时数据?
我是否应该维护两个单独的数据库 - 一个用于只读和实时数据,另一个仅用于编辑(这是实时的精确副本)?即使我创建了两个数据库,如何更新更新的数据并将其添加到生产中?
我会通过将编辑的字段存储为具有更新链接属性的approve
操作的单独架构来解决此问题。
这是部分不完整/伪代码 — 您对自己的工作负责:
模型:
class PropertyEdit
belongs_to :property
belongs_to :reviewer, class_name: 'Admin'
enum :state, [ :pending, :approved, :cancelled ]
def approve_changes(admin)
if property.update { field_name => suggested_value }
self.reviewer = admin
approved!
else
# Handle error
end
end
end
class Property
has_many :property_edits
end
用于处理属性更新的控制器方法:
class PropertiesController < ApplicationController
def edit
@property = Property.find(params[:id])
end
def update
@property = Property.find(params[:id])
@property.attributes = property_update_params
if @property.valid?
@property.changes.each do |attribute, (old, new)|
edit = @property.property_edits.new({
field_name: attribute,
previous_value: old,
suggested_value: new
})
edit.save
end
flash[:success] = "Your updates will be live once approved."
redirect_to property_path(@property)
else
render :edit
end
end
protected
def property_update_params
params.require(:property).permit(:price, :address, :city)
end
end
要处理审阅编辑,您现在一次只能进行一个编辑以供审批,以及所有更改的日志。
您可能希望添加逻辑来处理边缘情况和通信:
- 为同一字段输入较新的编辑内容时取消挂起的编辑内容
- 构建一个包含待处理编辑的 Property 实例供用户查看;使用
_changed?
属性在相关编辑中显示"待处理"标记 - 弄清楚如何最好地集成照片的文件处理,因为您需要确定处理任何转换、压缩等的最佳时间