2013-09-27 1 views
1

По какой-то причине я не могу украсить определенную модель, не имея возможности даже получить доступ к атрибутам этой модели через декоратор в консоли.Невозможно украсить определенную модель - уровень стека слишком глубокий

Я постоянно получаю Stack Too Deep ошибки непоследовательно; непоследовательно за пределами того факта, что я вообще не могу получить доступ к атрибутам оригинальной модели, прежде чем получить ошибку Stack Too Deep.

Поведение действительно бизарр, потому что test_method работает при попытке сначала, но я не могу фактически получить доступ к тем же атрибутам исходной модели; Я создал тонны декораторов и никогда не сталкивался с этой проблемой.

декоратор довольно прост:

class PersonaDecorator 
    attr_reader :persona 

    include ActionView::Helpers 


    def initialize(persona) 
    @persona = persona 
    end 

    def self.decorate_personas(personas) 
    personas.map { |persona| new(persona) } 
    end 

    class << self 
    alias_method :build_collection, :decorate_personas 
    end 

    def respond_to_missing?(method, include_private=false) 
    persona.respond_to?(method) || super 
    end 

    def method_missing(method, *args, &blocks) 
    persona.send(method, *args, &block) 
    end 

    def age 
    "#{persona.age} years old" 
    end 


    def description 
    "#{persona.description}".html_safe 
    end 

    def test_method 
    content_tag(:div, "#{persona.description}") 
    end 

    def test_method2 
    content_tag(:div, "#{persona.creative_commons_attribution}") 
    end 

    def class_box 
    content_tag :div, class: 'large-12.columns' do 
     cc_class = case persona.creative_commons_attribution_license 
      when 'Attribution-ShareAlike' 
      'cc_sa' 
      when 'Attribution-NoDerivs' 
      'cc_nd' 
      when 'Attribution-NonCommercial' 
      'cc_nonc' 
      when 'Attribution-NonCommercial-NoDerivs' 
      'cc_nonc_nd' 
      when 'Attribution-NonCommercial-ShareAlike' 
      'cc_nonc_sa' 
      end 

      content_tag(:figure, class: "large-3-columns creative_commmons_attribution_badge #{cc_class}") 
      content_tag :a, class: 'creative_commons_explanation' do 
      "#{persona.creative_commons_attribution}" 
      end 
    end 
    end 

end 

Модель также довольно просто:

class Persona < ActiveRecord::Base 

    #virtual attributes 
    attr_accessor :approve_persona, :unapprove_persona, :full_name 

    #special configuration, properties, and actions 
    CREATIVE_COMMONS_ATTRIBUTION_LICENSES = %w(None Attribution-ShareAlike Attribution-NoDerivs Attribution-NonCommercial Attribution-NonCommercial-ShareAlike Attribution-NonCommercial-NoDerivs) 
    has_attached_file :avatar 
    has_attached_file :background_image 
    extend FriendlyId 
    friendly_id :slug_candidates, use: [:slugged, :history] 

    # call backs 
    before_save :perform_state_change 
    include NameConcern 

    # validations 
    validates :first_name, :last_name, presence: true 
    validates_attachment :avatar, content_type: { content_type: ["image/jpeg", "image/webp", "image/png"] }, size: { less_than: 5.megabyte } 
    validates :age, numericality: { greater_than: 0, integer: true } 
    validates :description, length: { minimum: 50 } 
    validates :byline, length: { maximum: 140 } 
    #validates :project, presence: true 
    validates_with CreativeCommonsValidator 

    #associations 
    belongs_to :project 
    has_many :influencers 
    has_many :interests 
    has_many :goals, as: :goalable 

    # state_machine 
    state_machine :state, initial: :pending do 
    state :approved 
    state :coming_soon 
    end 

    def full_name 
    "#{first_name} #{last_name}" 
    end 

    def slug_candidates 
    [ 
     :full_name, 
     [:full_name, :age], 
     [:full_name, :occupation, :age] 
    ] 
    end 


    def perform_state_change 
    self.state = 'approved' if approve_persona == '1' 
    self.state = 'pending' if unapprove_persona == '1' 
    end 


end 

В случае валидатора может быть причиной, это базовый уровень один (хотя тот, который не может быть одной подкладке через Proc

class CreativeCommonsValidator < ActiveModel::Validator 
    def validate(record) 
    if record.creative_commons_license != "None" || !record.creative_commons_license.blank? 
     if record.creative_commons_attribution.blank? || record.creative_commons_attribution_link.blank? 
     record.errors[:base] << "name and link to original owner of copyright work attached for this record incorrectly done." 
     end 
    end 
    end 
end 

валидатор однако работает правильно в контексте, который он должен (новые и существующие записи), поэтому он сомнительно для меня, это проблема ...

ответ

0

Я думаю, причина в том, что вы ссылались на persona вместо переменной экземпляра @persona во всем методе экземпляра. В экземпляре PersonaDecorator нет такой вещи persona.

Мое предложение, чтобы заменить все из них в переменную экземпляра, кроме self.decorate_personas и удалить attr_reader, который на самом деле относится к самому объекту и может быть непосредственной причиной «уровня стека слишком глубоко»

+0

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

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