Rails不允许在特定条件下更新属性

时间:2016-06-06 02:49:22

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

假设我正在更新名为status的属性。我不希望status能够在当前cancelledcomplete时更新。我怎么能不允许这样做,但允许更新status

4 个答案:

答案 0 :(得分:2)

您可以使用before_update回调。

   before_update :prevent_update_if_status_canceled_or_completed?

  private

  def prevent_update_if_status_canceled_or_completed?
    if status == 'canceled' || status == 'complete'
      self.errors.add_to_base "Cannot update a completed or canceled record "
      false
    else 
      true
  end
end

答案 1 :(得分:0)

您可以使用transitions gem。它非常整洁。

答案 2 :(得分:0)

您可以在为该用户创建状态时进行检查。

def create
  @user = User.find(params[:user_id])
  unless @user.status == "cancelled" || @user.status == "completed"
    @status = @user.statuses.new(status_params)
    if @status.save!
      respond_to do |format|
        ...
        #status created logic, render desired content to user
      end
    end
  else
    #Handle status not created logic
  end
end

答案 3 :(得分:-1)

我猜你有一个update方法,如:

def update
  params[:model_name].delete :status if @model_name.status == "cancelled"
  @model_name = @model_name.update(model_params) # model_params are the parameters you're allowing with strong parameters.
  .....
end

使用条件语句从strong参数中删除status

或者,您可以创建一个private方法来排除status的更新。

def except_satatus_params
  params[:model_name].except(:status)
end

然后在控制器上使用此方法,检查@model.status之前是cancelled还是complete