В вашем случае для сохранения id
в session
требуется некоторое действие пользователя (чтобы выбрать, какое из них).
Вам нужно будет отправить данные в params
и показать их в URL или , отправив в методе request body
POST
,требуя от вас использовать hidden_field
.Если вы не хотите, чтобы показывал ваши id
конфиденциальные данные, вам нужно создать обходной путь.
Я предлагаю вам использовать какой-либо метод шифрования для передачи данных в параметры,поскольку вашей главной заботой является то, что вы не хотите, чтобы идентификатор был видимым.Существует множество методов шифрования и библиотек, это только мое предлагаемое решение.
Я создал custom_route
, который получит encrypted_id
, поэтому вам не нужно писать hidden_field
в форме.
get "/set_id/:encrypted_id" => "your_controller#set_encrypted_id", as: :set_id_route
И в представлении используйте custom_route
вдоль MessageEncryptor
следующим образом:
<% cookies[:salt] = SecureRandom.urlsafe_base64(32) %>
<% cookies[:pass] = 'some_password' %>
<% key = ActiveSupport::KeyGenerator.new(cookies[:pass]).generate_key(cookies[:salt], 32) %>
<% crypt = ActiveSupport::MessageEncryptor.new(key) %>
<% @owned_objects.each do |obj| %>
<%= form_for [obj, @wizard],
url: set_id_route(encrypted_id: crypt.encrypt_and_sign(obj.id)), # Or however you send the id
as: :wizard, method: :get do |f| %>
bla bla
<%= f.submit %>
<% end %>
<% end %>
Идентификатор будет отправлен в URL, но не будетбыть читабельным.
А затем в контроллере, который вы хотите получить запрос, расшифруйте его и установите в session
.
def set_encrypted_id
key = ActiveSupport::KeyGenerator.new(cookies[:pass]).generate_key(cookies[:salt], 32)
crypt = ActiveSupport::MessageEncryptor.new(key)
session[:id] = crypt.decrypt_and_verify params[:encrypted_id]
render json: { session_id: 'ok' }
end
Я написал этот пример чтения и установки cookies
для вас, чтобы легко воспроизвести его, но они должны быть записаны в вашей базе данных или в ENV
переменных.В моем решении некоторые вещи не являются необходимыми, например, метод :get
или то, что encrypted_id
отправляется в параметрах URL (его можно отправить в request body
другого метода), но идея та же,Я надеюсь, что этот ответ будет вам полезен: если вам нужно взаимодействие с пользователем, вам нужно как-то об этом рассказать.