#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. объяснил, дайте мне знать, если у вас возникнут какие-либо вопросы.