Nano Hash - криптовалюты, майнинг, программирование

First_or_initialize и вложенные атрибуты

У меня есть модель User с электронной почтой и именем пользователя.
У меня есть вложенная модель Profile с именем. >, позиция и описание.

Когда User регистрируется, все (кроме описания) требуется. У меня есть единственная форма, которая отлично работает с этой вложенной моделью.

Форма регистрации

Теперь приходит Oauth: я хочу, чтобы посетители могли регистрироваться, используя свою учетную запись GitHub.
Этот метод (RailsCast #235) позволяет мне инициализировать новый User и автоматически заполнять 4 атрибута User: провайдер, uid, адрес электронной почты и имя пользователя. .

def self.from_omniauth(auth)
  where(auth.slice(:provider, :uid)).first_or_initialize do |user|
    user.provider = auth.provider
    user.uid = auth.uid
    user.email = auth.info.email
    user.username = auth.info.nickname
  end
end

Но я также хотел бы инициализировать вложенный профиль с именем и, в конечном итоге, с позицией, заполненным информацией из хэша, который я получаю с GitHub.

Я пытался вставить что-то вроде user.build_profile(:name => auth.info.name) или user.profile.name = auth.info.name, но не могу найти, как создать этот вложенный элемент.


Ответы:


1

я решил эту проблему, сделав это, как показано ниже (я использую devise и ominath):
ЭТО "RegistrationsController"

# GET /resource/sign_up
def new
   resource = build_resource({})
   # check the session exists or not
   if session["devise.user_person_attributes"]
      ### just do anything you need to do prefill the form. this works very well for me
      resource.build_person(gender: session["devise.user_person_attributes"]["gender"]) 
   else
      resource.build_person
   end
   respond_with root_path
end

И ДЛЯ "OmniauthCallbacksController" Я ДЕЛАЮ ЭТО:

def all
    omniauth = request.env["omniauth.auth"]
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
    if authentication
        .
        .(SOME CODE OMITTED)
    elsif current_user
        .
        .
        .(SOME CODE OMITTED)
    else
        user = User.from_omniauth(omniauth)
        flash[:notice] = "Please finalize your registration"
        session["devise.user_attributes"] = user.attributes
        session["devise.user_person_attributes"] = user.person.attributes
        session["devise.auth_attributes"] = user.authentications.first.attributes

        redirect_to new_user_registration_url
    end
end

alias_method :twitter, :all
alias_method :facebook, :all 

это работает круто для меня! и я надеюсь, что это поможет и другим.

26.08.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..