2014-02-02 1 views
0

Я совершенно новый в RoR, и сейчас я столкнулся с проблемой. Я реализую систему посещаемости, и у меня есть ресурс Event в приложении. То, что я хочу сделать, - это возможность вызвать event.color (на экземпляре Event) и вернуть классическую строку цвета css (например, # 2EAC6A). Я не хочу создавать новый столбец или таблицу в базе данных, если это возможно. Это означает, что было бы лучше, если бы эта переменная обрабатывалась самим рубином цвет.Как создать «экземпляр». «Метод» может быть вызван - Ruby on Rails

Я хочу установить цвет события после его создания в зависимости от его типа. То, что я имел в виду что-то вроде этого, чтобы установить цвет:

class Event < ActiveRecord::Base 
    after_create :set_color 
    ... 

    def set_color 
    case self.type 
    when type1 
     #Here I want to set the color for event of type1 
    when type2 
     #Here I want to set the color for event of type2 
    when .... 
    . 
    . 
    end 
end 

Это только для установки цвета (и до сих пор я не уверен, что это функциональный ...), но я понятия не имею, как сохранить переменная цвета для каждого события без базы данных и как сделать возможным вызов метода Event.color. Я использую RoR v 3.2.14

Прошу, я был бы рад за любую помощь. Спасибо, у меня хороший день!

J.S.

ответ

1

Если ваши цвета никогда не меняются - или каждый тип1 всегда имеет тот же цвет, что и другой тип1, вы можете использовать разные CONSTANTS в своей модели или битовой маске.

пример использования констант:

class Event < ActiveRecord::Base 

    COLOR_TYPE1 = "#2EAC6A" 
    COLOR_TYPE2 = "#000000" 
    COLOR_TYPE3 = "#ffffff" 

    def color 
    case self.type 
    when type1 
     COLOR_TYPE1 
    when type2 
     COLOR_TYPE2 
    when type3 
     COLOR_TYPE3 
    else 
    raise "for this type is no color defined!" 
    end 
    end 

end 

Вы won't нужно установить цвет - потому что вы не имеете цвет атрибута. Просто используйте обычный метод, который возвращает правильный цвет для экземпляра, в зависимости от типа экземпляра.

Другой вариант без констант: (этот подход лучше, чем предыдущий, по-моему :-))

class Event < ActiveRecord::Base 

    def color 
    case self.type 
    when type1 
     "#2EAC6A" 
    when type2 
     "#000000" 
    when type3 
     "#ffffff" 
    else 
    raise "for this type is no color defined!" 
    end 
    end 

end 

Если у вас есть различные классы для каждого экземпляра, вы не должны использовать константы, вам только может определять цвета непосредственно:

class Type1 < Event 
    def color 
    "#2EAC6A" 
    end 
end 

def Type2 < Event 
def color 
    "#000000" 
end 
end 

def Type3 < Event 
    def color 
    "#ffffff" 
    end 
end 

Различные классы имеют преимущество, что вы можете обрабатывать все ваши вещи, которая зависит от типа непосредственно в подклассе вашего родительского класса «Event». Вы поняли?

+0

Это работает как шарм! Спасибо! – Samah

+0

Я обновил свой ответ и добавил больше идей :) – Mattherick

+0

Я получаю идею, но не обязательно иметь разные классы для каждого экземпляра, поскольку тип - это еще одна переменная, и она используется для отображения типа и распознавания типа посещаемости (например, Vacation, Больной день, командировка и т. Д.). Поскольку цвет для типа события никогда не меняется, ваша первая реализация просто прекрасна! Еще раз спасибо Mattherick :) – Samah