как инициализировать атрибут объекта

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

У меня есть класс Metric:

 class Metric < ApplicationController

  attr_accessor :capability, :behavior

  def initialize(family_id)
    @capability = 5
  end 
end
  

В контроллере я делаю:

 metrics = Metric.new(222)
  

Затем я пытаюсь получить атрибут capability с помощью:

 puts metrics.capability
  

но я получаю сообщение об ошибке:

 NoMethodError Exception: private method `capability' called for #<Metric:0xa7bb4b0 @capability=5>
  

Что я делаю не так???

Комментарии:

1. Вы уверены, что у ApplicationController нет метода с таким именем?

Ответ №1:

Вам не нужно наследовать от ApplicationController . Прекратите наследовать его, он начнет работать.

Если вы хотите инициализировать атрибут во всех действиях, все, что вам нужно сделать, это

 class Metric 

  attr_accessor :capability, :behavior

  def initialize(family_id)
    @capability = 5
  end 
end


 class ApplicationController < ActionController::Base
  before_action :initialize_metric_attribute

   def initialize_metric_attribute
     @capability = Metric.new(10)
   end
 end
  

Редактировать на основе комментария:
Вы наследуете от ApplicationController . Он должен наследоваться только тогда, когда вы хотите его написать action . Для записи custom classes вам не нужно ничего делать. При необходимости вы можете наследовать ActiveRecord::Base .

Поскольку у вас есть initialize метод в вашем классе metric class, вам даже не нужно AR .

Почему это сработало?

Мы только что использовали before_filter обратный вызов, который инициализирует ваш атрибут. это простая концепция Ruby и Rails.

Комментарии:

1. Вероятно, для этого есть причина.

2. объяснил, дайте мне знать, если у вас возникнут какие-либо вопросы.