Как я могу сохранить идентификатор, выбранный из массива ассоциации в переменной сеанса рельсы? - PullRequest
0 голосов
/ 25 октября 2018

Я прекрасно понимаю, как хранить идентификатор в сессии.Вы просто заходите в свой контроллер и делаете что-то вроде

@object = Object.find_by(params[:id)
session[:first_object] = @object 

Но что, если у меня есть целая куча разных объектов на мой взгляд, и мне нужно только передать один в сеанс?Я не могу использовать hidden_fields.Обычно я передаю его в качестве аргумента form_for, но я бы предпочел, чтобы идентификатор объекта не отображался в URL.

<% @owned_objects.each do |obj| %>
 <%= form_for [obj, @wizard], as: :wizard, url: object_one_wizard_path(obj) do |f| %>
 bla bla
<% end %>

1 Ответ

0 голосов
/ 29 октября 2018

В вашем случае для сохранения 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 другого метода), но идея та же,Я надеюсь, что этот ответ будет вам полезен: если вам нужно взаимодействие с пользователем, вам нужно как-то об этом рассказать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...