2013-09-18 4 views
5

У меня есть модель пользователя. какКак проверить тип поля поля в рельсах 3

class User < ActiveRecord::Base 
    attr_accessor :username :campaign_id 
    attr_accessible :name, :email, :username 
end 

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

u = User.first 

вернет

#<User id: 190, name: "sa", :email: "[email protected]", username: "ab"> 

Так что вопрос: Есть ли способ, чтобы проверить, является ли один атрибут например, 'name' - attr_accessor или attr_accessible?

+0

Если вы не добавили тестов/rspec, не могли бы вы объяснить, что вы пытаетесь выполнить? – nathanvda

+0

Собственно. У меня есть какой-то существующий код, перезаписываемый устройством. и сырой пароль также сохраняется в db. но для пароля устройства это поле attribute_accessor, поэтому, на мой взгляд, я не могу отобразить пароль. –

ответ

2

Если я правильно понимаю, Разрабатывают attr_accessor :password скрывает ваше поле пароля в базе данных. Чтобы обойти это, вы могли бы сделать что-то вроде

def raw_password 
    self[:password] 
end 

def raw_password= (new_password) 
    self[:password] = new_password 
end 

Разумеется, это совершенно не обращая внимания на то, что не очень безопасно хранить пароль в текстовом виде в базе данных. Devise предлагает достаточно механизмов для пользователей, чтобы управлять своим собственным паролем, поэтому вы не должны держать сырой пароль намного дольше.

+0

Спасибо @nathanvda. оно работает . :) –

1

Возможно, не самое лучшее решение, но, посмотрев на the source code я думаю, вы могли бы проверить, если :name появляется в _accessible_attributes поле вашего класса или нет.

+0

Его хороший способ. пусть c, если я получаю любое другое хорошее решение. –

0

Я думаю, вы пытаетесь узнать, является ли атрибут только переменной экземпляра, созданной с помощью attr_accessor или фактического столбца в базе данных. Вы можете получить список столбцов db для модели через User.column_names. Таким образом, метод класса, как показано ниже может работать

# User.rb 

def self.column_in_db?(attrib) 
    column_names.include?(attrib.to_s) 
end 
+0

Собственно. У меня есть какой-то существующий код, перезаписываемый устройством. и сырой пароль также сохраняется в db. но для пароля устройства это поле attribute_accessor, поэтому, на мой взгляд, я не могу отобразить пароль. –

+0

Итак, пароль атрибута - это столбец db, и его можно использовать как attr_accessor. Вы хотели бы знать, как отображать пароль, хранящийся в db в представлении? – tihom

1

Вы можете проверить любой метод является ли объект attr_accessor по:

my_object.respond_to?(:name) && my_object.respond_to?(:name=) 

Возвращаемое значение верно указывает на то, что как геттер и сеттер существуют для: имени. Это просто стандартный код рубина и само определение метода attr_accessor:

Определяет именованный атрибут для этого модуля, где имя symbol.id2name, создавая переменный экземпляр (@name) и соответствующий метод доступа чтобы прочитать его. Также создается метод name = для установки атрибута.

Вы можете проверить, если метод attr_accessible по:

MyObject.attr_accessible[:default].deny?(:name) 

где MyObject это имя класса модели и: имя атрибута, которое вы запрашиваете. Возвращаемое значение false означает, что атрибут доступен.

+0

Это тоже хороший вариант. (У) –

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