Как установить некоторый тип маркера в методе, чтобы я мог сказать, был ли метод успешно выполнен или нет в ruby ​​на рельсах - PullRequest
0 голосов
/ 22 февраля 2012

У меня есть методы класса, подобные этим в модели "сообщения":

 def delete_all_users_messages(user_id, parent_id)
          message = Message.find_by_parent_id(parent_id)
          message.children.where(:sender_id => user_id ).update_all(:sender_status => 1)
          message.children.where(:recipient_id => user_id ).update_all(:recipient_status => 1 )
          thread = message.message_thread
          thread.update_attribute(:sender_status, 1) if thread.sender_id == user_id 
          thread.update_attribute(:recipient_status, 1) if thread.recipient_id == user_id 
            if thread.sender_status == 1 && thread.recipient_status == 1
            thread.delete
            Message.delete_all(:parent_id => parent_id)
            end
        end

        def delete_all_users_selected_messages(message_ids, user_id, parent_id)
          Message.where(:id => message_ids, :sender_id => user_id).update_all(:sender_status => 1)
          Message.where(:id => message_ids, :recipient_id => user_id).update_all(:recipient_status => 1)
          Message.where('id != ? AND parent_id = ?', parent_id, parent_id).where(:sender_status => 1, :recipient_status => 1).delete_all
          thread = MessageThread.find_by_message_id(parent_id)
          children_exist = thread.message.children.where('id != ? AND parent_id = ?', parent_id, parent_id).any?
            unless children_exist
              thread.delete 
              thread.message.delete
            end

Я использую их в моем messages_controller, как это:

def destroy_all_messages
    Message.delete_all_users_messages(current_user.id, params[:format])
    flash[:success] = "Messages deleted"
    redirect_to messages_path
  end


  def destroy_selected_messages
    Message.delete_all_users_selected_messages(params[:message_ids], current_user.id, params[:format])
      flash[:success] = "Messages deleted"
      redirect_to :back
  end

Я хотел бы также вернуть сообщение об ошибке, если что-то пошло не так ... но поскольку вся логика удаления сообщений в моей модели, это довольно сложно сделать.

Может ли кто-нибудь предоставить решение с примером того, как я мог бы использовать какое-то условие, чтобы показать свое сообщение об успешном завершении, если сообщения были удалены, и ошибку, если их не было, потому что что-то пошло не так. Должны быть какие-то маркеры, которые я могу поместить в методы класса, чтобы подтвердить, что они успешно прошли определенную точку.

Спасибо за ваше время С уважением

1 Ответ

1 голос
/ 22 февраля 2012

Вот два предложения, которые я бы сделал для вас здесь.

Во-первых, ваши методы возвращают false, если то, к чему они были призваны, не произошло. Итак, что-то вроде этого:

if thread.delete && Message.delete_all(:parent_id => parent_id)
  return true
else
  return false
end

Затем в вашем контроллере вы можете проверить состояние метода:

def destroy_all_messages
  if Message.delete_all_users_messages(current_user.id, params[:format])
    flash[:success] = "Messages deleted"
    redirect_to messages_path
  else
    flash[:error] = "Messages could not be deleted"
    render :action => :show
  end
end

Это метод, который я бы рекомендовал; если вам нужно несколько сообщений об ошибках для разных этапов процесса, я бы разбил ваш метод delete_all_user_messages на отдельные компоненты, каждый из которых указывает на истину или ложь, независимо от того, были они успешными или нет.

В качестве альтернативы, вы можете вызывать пользовательские сообщения об ошибках и спасать их в своем коде. Примерно так:

raise ThreadNotDeleted unless thread.delete 

И тогда в вашем контроллере вы спасаете ThreadNotDeleted и разбираетесь там. Хотя это работает, я думаю, что другой метод предпочтительнее.

...