允许用户编辑信息,但在上线前需要管理员批准

时间:2017-01-13 01:24:19

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

我有一个使用Rails 4.4的网站,用户可以在其中展示他们的待售物业。用户通过注册和上传来提供其属性的数据和图片,然后管理员验证数据并询问用户是否可以在批准数据并使其生效之前使数据生效。

我想允许用户返回并编辑或添加新数据。例如,用户可能想要添加新图片或更新其属性的地址。

如何让用户在不实际上线的情况下编辑实时数据?

我应该维护两个独立的数据库 - 一个用于只读和实时数据,另一个仅用于编辑(这是实时的精确复制品)?即使我创建了两个数据库,如何更新更新的数据并将其添加到生产中?

1 个答案:

答案 0 :(得分:0)

我会通过将已编辑的字段存储为具有更新链接属性的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

要处理审核编辑,您现在可以一次批准一个编辑,并记录所有更改。

您可能希望添加逻辑来处理边缘情况和通信:

  1. 在为同一字段输入较新的内容时取消待处理的修改
  2. 构建具有待处理编辑的Property实例,供用户查看;使用_changed?属性在相关修改上显示“待定”标记
  3. 弄清楚如何最好地整合照片的文件处理,因为您需要确定处理任何转换,压缩等的最佳时间。