Rails сессия пуста при использовании HTTP put - PullRequest
9 голосов
/ 09 марта 2011

У меня есть ситуация, когда одна конкретная ссылка приводит к пустому хэшу сеанса. Это не хорошо, так как мне нужно найти модель с помощью session_id.

Ссылка, которая вызывает проблемы:

<div id="marker_images">
  <% @marker_image_urls.each do |image_url| %>
    <%= link_to( image_url, 
                 location_type_path(@location_type.id, 
                 :location_type => {:preset_marker_url => image_url}), 
                 :method => :put,
                 :remote => true ) %>
  <% end %>
</div>

и код, который находит модель по идентификатору сеанса (который вызывается с использованием before_filter):

def get_organisation
  @organisation = Organisation.find_by_session_id(session[:session_id])
end

В режиме отладки, session == {}

Если я изменю link_to на HTTP «get» вместо «put», сеанс будет отправлен. Однако этот запрос не подходит для метода get, поскольку он изменяет данные.

Почему «get» включает сессию, а «put» нет?

Ответы [ 3 ]

9 голосов
/ 11 марта 2011

Хорошо, нашел это.Поскольку ссылка представляет собой http-put, rails не включает автоматически токен аутентификации, как это происходит с http-get.Таким образом, передавая маркер подлинности в качестве параметра, rails распознает сеанс.

<div id="marker_images">
  <% @marker_image_urls.each do |image_url| %>
    <%= link_to( image_tag(image_url), 
                 location_type_path(@location_type.id, 
                                    :location_type => {:preset_marker_url => image_url},
                                    :authenticity_token => form_authenticity_token), 
                 :method => :put,
                 :remote => true ) %>
  <% end %>
</div>

Эта страница помогла мне наткнуться на это решение: http://www.kolodvor.net/2010/01/02/rails-csrf-and-ajax-requests/

1 голос
/ 04 января 2012

Это вызвано защитой CSRF в Rails. См. это уведомление о патче безопасности

Чтобы навсегда решить эту проблему, следуйте инструкциям по ссылке выше. Последние версии rails.js были исправлены для добавления параметра authenticity_token во все запросы AJAX, генерируемые Rails.

Если вы обновляете более раннюю версию Rails, вам может потребоваться включить csrf_meta_tag в ваш макет, как предлагает Викрант Чаудхари.

1 голос
/ 13 декабря 2011

Это происходит, если вы забыли добавить <%= csrf_meta_tags %> в свой макет. Добавьте это как

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