БЫСТРОГО ПРЕДПОСЫЛКИРельсы 3: CSRF с form_tag
У меня есть модель, где facility
HAS_MANY managers
через relationships
. Модель отношения содержит один дополнительный атрибут: admin
, который является булевым. Затем для каждого объекта у меня есть страница, которая позволяет администратору/некоторому пользователю пометить managers
как admin
или нет. Они делают это через флажки. Я использую программу для менеджеров. Все довольно много сделано, как первые 2 минуты этого railscast:
http://railscasts.com/episodes/165-edit-multiple-revised?view=comments
ПРОБЛЕМА (S)
Вопрос в том, когда я представляю form_tag, я получаю:
1. ПРЕДУПРЕЖДЕНИЕ: не удается проверить подлинность CSRF токен
2. Затем он сбрасывает мой сеанс пользователя (меня выводит из строя), поэтому мне нужно снова войти в систему, чтобы продолжить работу.
Если я удалю protect from forgery
с контроллера приложения, все работает плавно, но, очевидно, я не хочу это делать как свое исправление.
Итак, как я могу избежать этой проблемы CSFR с помощью form_tag?
ФОРМА (обновлена)
<%= form_tag admin_relationships_path, method: :put do %>
<table>
<tr>
<th></th>
<th>Person Name</th>
<th>Admin</th>
</tr>
<% @relationships.each do |relationship| %>
<tr>
<td><%= check_box_tag "relationship_ids[]", relationship.id %></td>
**<%= hidden_field_tag :authenticity_token, form_authenticity_token %>**
<td><%= User.find(relationship.user_id).full_name %></td>
<td><%= relationship.admin ? "Yes" : "No" %></td>
<td><%= link_to 'Remove', relationship, method: :delete, **remote: true** %></td>
</tr>
<% end %>
</table>
<%= submit_tag "Make Checked Admins" %>
<% end %>
Контроллер илит.
class RelationshipsController < ApplicationController
def destroy
@relationship = Relationship.find(params[:id])
@relationship.destroy
respond_to do |format|
format.html { redirect_to "/facilities/1679/invite", notice: " Manager has been deleted." }
format.json { head :no_content }
end
end
Журнал.
Started DELETE "/relationships/52" for 127.0.0.1 at 2013-11-26 14:30:11 -0500
Processing by RelationshipsController#destroy as JS
Parameters: {"id"=>"52"}
WARNING: Can't verify CSRF token authenticity
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 38 LIMIT 1
(0.1ms) BEGIN
(0.1ms) COMMIT
Relationship Load (0.2ms) SELECT `relationships`.* FROM `relationships` WHERE `relationships`.`id` = 52 LIMIT 1
(0.1ms) BEGIN
SQL (0.2ms) DELETE FROM `relationships` WHERE `relationships`.`id` = 52
(0.4ms) COMMIT
Redirected to http://localhost:3000/facilities/1679/invite
Completed 302 Found in 10ms (ActiveRecord: 1.6ms)
Started DELETE "/facilities/1679/invite" for 127.0.0.1 at 2013-11-26 14:30:11 -0500
ActionController::RoutingError (No route matches [DELETE] "/facilities/1679/invite"):
Заголовки запросов:
Accept
, Accept-Encoding
, Accept-Language
, Connection
, Cookie
, Host
, Origin
, Referer
, User-Agent
, X-Requested-With
ОТВЕТ
Как плакат Бела ow, мой токен CSFR не был получен на странице. Хотя, у меня был <%= csrf_meta_tag %>
в моем макете приложения и макете администратора, и я фактически отображал макет приложения, форма находилась на странице Devise.
Так что мне нужно было установить код <%= csrf_meta_tag %>
в devise.html.erb.
Ниже приведен поиск неисправностей.
Все еще не работает, мне нужно также добавить метод отправки? И просто, чтобы заявить об этом, я каждый раз перезапускаю сервер. – miler350
Нет, это либо или. Какую версию Rails вы используете? Если вы в 3.1 попробуете этот ответ: http://stackoverflow.com/questions/7203304/warning-cant-verify-csrf-token-authenticity-rails#answer-8798687 – DiegoSalazar
Я не знаю, в чем проблема. , Это тоже не работает. Приложение использует 3.2.11. – miler350