проверки статической модели рельсов - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть модель Subject, которая представляет древовидную структуру с родительскими дочерними узлами.

Чтобы переместить тему в другую ветвь / узел, мне нужно иметь 2 идентификатора субъекта, которые представляют значения from и to.

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

Вот часть кода моего контроллера.

def copy
    from = Subject.find(params[:from])
    to = Subject.find(params[:to])

    if to.is_descendant_of? from
        render :json => {:error => ["Can't move branch because the target is a descendant."]}.to_json,  :status => :bad_request
        return
    end

    if to.read_only?
        render :json => {:error => ["Can't copy to this branch as it is read only."    ]}.to_json,  :status => :bad_request
        return
    end

    if params[:subjects] == 'copy'
      subject = Subject.create(:name => from.name, :description => from.description, :parent_id => to.id)

      #recursively walk the tree
      copy_tree(from, subject)
    else
      #move the tree
      if !(from.read_only or to.read_only)
        to.children << from
      end
    end

end

Вот что я начал делать в моей модели

class Subject < ActiveRecord::Base



    def self.copy(from, to, operations)

        from = Subject.find(from)
        to = Subject.find(to)

        if to.is_descendant_of? from
           #how do I add validation errors on this static method?

        end

    end
end

Моя первая задача - как добавить ошибки в статический метод в модели?

Iя не уверен, правильно ли я поступаю, используя статический метод или метод экземпляра.

Кто-нибудь может мне помочь с рефакторингом этого кода?

1 Ответ

1 голос
/ 13 сентября 2011

У вас есть три возможных решения.(Я предпочитаю третий подход)

1) Возвращать ноль при успехе, строку ошибки при ошибке

# model code
def self.copy(from, to, operations)
  if  to.is_descendant_of? from
    return "Can't move branch because the target is a descendant."
  end
end

# controller code
error = Subject.copy(params[:from], params[:to], ..) 
if (error)
  return render(:json => {:error => [error]},  :status => :bad_request)
end

2) Бросать исключение при ошибке

def self.copy(from, to, operations)
  if  to.is_descendant_of? from
    throw "Can't move branch because the target is a descendant."
  end
end

# controller code
begin
  Subject.copy(params[:from], params[:to], ..) 
rescue Exception => ex
  return render(:json => {:error => [ex.to_s]},  :status => :bad_request)
end

3)Добавьте метод экземпляра в Subject class.

def copy_from(from, operations)
  if  is_descendant_of? from
    errors.add_to_base("Can't move branch because the target is a descendant.")
    return false
  end

  return true #upon success
end

# controller code
from = Subject.find(params[:from]) #resolve from and to
to = Subject.find(params[:to])

if to.copy_from(from)
  # success
else
  # errors
  return render(:json => {:error => [to.errors]},  :status => :bad_request)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...