2012-03-13 5 views
3

Я не очень много сделал с этими виртуальными атрибутами Jquery-tokeninput или Rails, но при этом ударил головой о стену. Любая помощь или руководство приветствуются.Проверка подлинности виртуальных атрибутов Rails 3

У меня есть читатель виртуального атрибута в моем объявлении модели, мне нужно, чтобы проверить наличие:

attr_reader :classroom_tokens 
validates :classroom_tokens, :presence => true`` 

с последующим геттер и сеттер:

def classroom_tokens=(ids) 
    self.classroom_tokens = ids.split(",") 
end 

def classroom_tokens 
    #Tried several things here 
end 

Я действительно просто нужно, чтобы убедиться, params [: announcement] [: classroom_tokens] не пуст. Вызываемый валидатор, похоже, смотрит на что-то еще, поскольку он всегда пуст, несмотря ни на что. Что мне не хватает? Любая помощь приветствуется.

Rails 3.1 рубин 1.9.2

UPDATE: Если я

#Announcement MODEL 
attr_reader :classroom_tokens 
#validates :classroom_tokens, :presence => true 
def classroom_tokens=(ids) 
    @classroom_tokens = ids.split(",") 
end 

#Announcement_controller create action 
puts "Token=>#{@announcement.classroom_tokens}|" 
puts "Params=>#{params[:announcement][:classroom_tokens]}|" 

я получаю:

Token=>| 
Params=>7,13,12| 
+0

Валидации происходят на моделях. Модели не должны знать ничего о параметрах, которые использовались для их создания. classroom_tokens либо есть, либо нет. Вы усложняете ситуацию, пытаясь добавить свои собственные методы setter/getter в объекты ActiveRecord, поскольку ActiveRecord пытается это сделать для вас. Если вам нужно установить токены класса из массива comma_delineated, сделайте для этого другой метод. Если вам нужен специальный геттер, назовите его чем-то другим, кроме имени атрибута. –

+0

Спасибо за ответ. С classroom_tokens, являющимся виртуальным атрибутом, я добавил установщика там, чтобы помочь с назначением comma_delineated и был под впечатлением, что я запутался с геттером. Сетчатка работает нормально. То, что я сделал, также было прочитано полностью, и все равно с тем же вопросом, где он думает, что он всегда пуст. – Yuri

ответ

8

Вместо установки self.classroom_tokens, просто установите переменную экземпляра @classroom_tokens, а затем удалить classroom_tokens, так как вы неявно определяете его, используя attr_reader. Код должен выглядеть так:

attr_reader :classroom_tokens 
validates :classroom_tokens, :presence => true`` 

def classroom_tokens=(ids) 
    @classroom_tokens = ids.split(",") 
end 
+0

ahh ... Я не знал, что attr_reader будет неявно определять его, но в ретроспективе это имеет смысл. С другой стороны, это дает мне тот же результат «пустой» ошибки. Быстрый просмотр параметров говорит мне, что он еще не спасет его. У меня нет другого кода модели, обрабатывающего этот атрибут. "Объявление" => {"classroom_tokens" => "13", "subject" => "no subject", "message" => "adsfadsfasdf", "location" => "adsfasdf", "date" => "27 -03-2012 "," allow_email "=>" 0 "," allow_call "=>" 0 "," allow_sms "=>" 0 "}} – Yuri

+1

' update_attributes' работает для меня, когда я вызываю 'user.update_attributes (: classroom_tokens => «foo, bar») ', поэтому я подозреваю, что проблема может заключаться в том, как вы это называете? Вы вызываете 'user.update_attributes (params [" announcement "])'? Также убедитесь, что у вас есть 'classroom_tokens' в' attr_accessible' –

+0

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

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

  • Нет связанных вопросов^_^