2015-06-16 4 views
0

Я пытаюсь создать новое предупреждение только в том случае, если оно закрыто, возвращает true, как я могу получить доступ к объекту из нового, чтобы проверить, охвачен ли он или нет, и если он правильно сохраняется, если не реагировать на ошибки. Моя ошибка NameError (неопределенная локальная переменная или метод `параметры для #):Как проверить правильность перед сохранением объекта с помощью нового действия

class Alert < ActiveRecord::Base 
    belongs_to :user 
    has_many :activities 

    scope :by_year, lambda { |year| where('extract(year from created_at) = ?', year) } 
    validate :is_covered, :before => :create 

    def is_covered 

     @schools = School.all 

    @schools.each do |school| 

      distance = triangulate(school.latitude, school.longitude, self.latitude, self.longitude) 

     if distance < school.radius.to_f 
     self.school_id = school.id 
     return self 
     else 
     self.errors.add(:latitude,"Sorry You Arent Within a School") 
     return self 
     end 
    end 
    end 
    def power(num, pow) 
     num ** pow 
    end 
    def triangulate(lat1, lng1, lat2, lng2) 

    dtor = Math::PI/180 
    r = 6378.14*1000 

     rlat1 = lat1.to_f * dtor 
    rlong1 = lng1.to_f * dtor 
    rlat2 = lat2.to_f * dtor 
    rlong2 = lng2.to_f * dtor 
    dlon = rlong1 - rlong2 
    dlat = rlat1 - rlat2 

     a = power(Math::sin(dlat/2), 2) + Math::cos(rlat1) * Math::cos(rlat2) * power(Math::sin(dlon/2), 2) 
     c = 2 * Math::atan2(Math::sqrt(a), Math::sqrt(1-a)) 

     distance = r * c 

    return distance 
    end 
end 

Контроллер

def create 
     @alert = Alert.create(alert_params).is_covered 
     @alert.status = "active" 

     respond_to do |format| 
      if @alert.save && @alert.valid? 
       log_activity(nil, "has created alert", @alert.id, @alert.school_id, "Alert") 
       format.json { render json: @alert.id} 
      else 
       format.json { render json: @alert.errors, status: :unprocessable_entity } 
      end 
     end 
     end 

ответ

2

Вы можете вызвать метод в создании действия в контроллере, он должен выглядеть примерно так :

def create 
    if Alert.new.is_covered? 
    #... Do some stuff 
    end 
end 

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

Я предположил, что ваш вопрос больше связан с тем, как получить доступ к этому методу с контроллера.

+0

если я действительно использую это как я могу получить объект оповещения – user3882976

+0

должен ли я использовать себя – user3882976

+0

Да, вы можете использовать self внутри метода. Но вы можете исключить себя. Например: если вы хотите выполнять действия, которые вы бы назвали self.activities, это то же самое, что и вызывающие действия. – neo

Смежные вопросы