Я использую Devise для аутентификации в веб-приложении Rails 5. Все мои представления регистрации пользователей сгенерированы разработчиками, и я добавил несколько полей в форму, чтобы иметь возможность динамически генерировать ключи PGP на внешнем интерфейсе. Я создал миграцию базы данных для этих дополнительных ключевых полей, и они сохраняются правильно. Теперь я пытаюсь добавить некоторые поля, которые я создаю на стороне сервера, которые не являются полями ввода пользователя.
Вот мой регистрационный контроллер:
class User::RegistrationsController < Devise::RegistrationsController
before_action :sign_up_params, only: [:create]
# before_action :configure_account_update_params, only: [:update]
def show
@user = User.find(params[:id])
end
private
def sign_up_params
params.require(:user).permit(
:handle,
:pin,
:email,
:password,
:password_confirmation,
:pgp_privatekey,
:pgp_publickey
)
end
end
Теперь я пытаюсь выяснить, каков «лучший» способ сохранения полей, которые не являются результатом ввода данных пользователем (например, оценка широты / долготы на основе их IP-адреса или что-то в этом роде). как биткойн-адрес, который полностью генерируется на стороне сервера). Я чувствую, что это может быть наиболее подходящим образом сделано в моем контроллере во время первоначального вызова контроллера регистрации, возможно, когда это происходит при первоначальной регистрации. Но так как он не управляется пользователем, я не уверен, где в моем контроллере имеет смысл добавить эту логику.
Я реализовал метод в моей модели User под названием «generate_bitcoin_keypair», и я хочу сохранить сгенерированные поля в правильной записи пользователя в БД, но я пытаюсь понять, должен ли я просто добавить это в свой первоначальный регистрационный код с помощью расширение базовой функциональности Devise с помощью вызова super () и блока ресурсов, или имеет ли смысл поместить это в другое место? Очевидно, что теперь, когда метод определен в моем коде модели User.rb, я могу вызвать его в своем контроллере, но я просто пытаюсь понять, является ли это лучшим, наиболее кратким способом сделать то, что я пытаюсь выполнить.
Вот моя модель пользователя:
require 'bitcoin'
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
def self.generate_bitcoin_keypair
key = Bitcoin::Key.generate()
{:btc_addr => key.addr, :btc_privkey => key.priv}
end
end
Должен ли я реализовать метод create в моем контроллере регистрации, который в основном вызывает код generate_bitcoin_keypair модели пользователя, а затем сохраняет его для соответствующего пользователя (на основе сеанса [: id])?
Я пытаюсь понять, как лучше всего это сделать, и если мой вопрос вообще неясен, пожалуйста, дайте мне знать.
Я думаю, что-то подобное может сработать:
def create
super do
btcdata = User.generate_bitcoin_keypair()
resource.btc_address = btcdata.btc_addr
resource.btc_privatekey = btcdata.btc_privkey
resource.save
end
end
в моем registration_controller.rb, но так как пользовательская запись уже была создана и сохранена в базе данных, я думаю, может быть, она должна быть чем-то вроде метода редактирования, а не метода создания, и я не совсем ясно, где именно должна сидеть логика.
Спасибо.