2013-08-05 5 views
0

Я использую Devise для аутентификации пользователей и переписываю/изменяю действие create на контроллере регистрации, однако он может стать довольно многословным и повторить тоже много. Я создаю приложение, в котором пользователь может установить держатель ключа для своей учетной записи, у которого есть определенные привилегии, и гостя, у которого есть доступ только для чтения.Использование текущего ресурса для упрощения кода в контроллере для Devise

То, что я пытаюсь достичь, - использовать объект «ресурс» в методе create, а не указывать, ссылаюсь ли я на гостя или владельца ключа. Например, проверка того, имеет ли пользователь уже владельца ключа или гостя для своей учетной записи (им разрешено только одно).

I.e. вместо того, чтобы что-то вдоль линий:

if @user.keyholder_id 
    # don't create keyholder 
end 

и

if @user.guest_id 
    # don't create guest 
end 

возможно использовать текущую resource_name, например:

if @user.{resource_name}_id.nil? 
    # create resource in question 
end 

ответ

0

Вы можете сделать:

@user.read_attribute("#{resource_name}_id").nil? 

установить атрибут динамически, вы используете:

@user.update_attribute("#{resource_name}_id", resource.id) 
+0

Благодарим за это - что делать, если я пытаюсь обновить guest_id current_user например? Раньше я делал это с помощью @ user.guest_id = resource.id - однако read_attribute генерирует синтаксическую ошибку при использовании таким образом. Благодаря! – ecs

+0

@ecs это тоже возможно. Я отредактировал свой ответ. –

+0

Это здорово, только то, что мне нужно, спасибо! В чем разница между write_attribute и update_attribute, или это не имеет значения в этом случае? – ecs