ноль. [] в request_forgery_protection при попытке рендеринга формы в рельсах 3 - PullRequest
2 голосов
/ 03 августа 2011

Rails выбрасывает NoMethodError на страницу всякий раз, когда я пытаюсь добавить к ней form_tag, и выдает следующую ошибку и трассировку стека:

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]

ruby/1.9.1/gems/actionpack-3.0.5/lib/action_controller/metal/request_forgery_protection.rb:114:in `form_authenticity_token'
ruby/1.9.1/gems/actionpack-3.0.5/lib/abstract_controller/helpers.rb:55:in `form_authenticity_token'
ruby/1.9.1/gems/actionpack-3.0.5/lib/action_view/helpers/form_tag_helper.rb:582:in `token_tag'
ruby/1.9.1/gems/actionpack-3.0.5/lib/action_view/helpers/form_tag_helper.rb:555:in `extra_tags_for_form'
ruby/1.9.1/gems/actionpack-3.0.5/lib/action_view/helpers/form_tag_helper.rb:566:in `form_tag_html'
ruby/1.9.1/gems/actionpack-3.0.5/lib/action_view/helpers/form_tag_helper.rb:573:in `form_tag_in_block'
ruby/1.9.1/gems/actionpack-3.0.5/lib/action_view/helpers/form_tag_helper.rb:52:in `form_tag'
app/views/teams/new.html.erb:1:in `_app_views_teams_new_html_erb__114968057028112192_2181733580__2538292988913059192'

Есть еще трассировка стека, но соответствующие частив том, что он вызывается из вызываемого form_tag и приводит к request_forgery_protection.

Когда я удаляю form_tag со страницы, ошибка сохраняется, но теперь она вызывается из <% = csrf_meta_tag%>в моем макете приложения.

Трасса в этом случае также указывает на ту же строку в методе request_forgery_protection в контроллере

ruby/1.9.1/gems/actionpack-3.0.5/lib/action_controller/metal/request_forgery_protection.rb:114:in `form_authenticity_token'
ruby/1.9.1/gems/actionpack-3.0.5/lib/abstract_controller/helpers.rb:55:in `form_authenticity_token'
ruby/1.9.1/gems/actionpack-3.0.5/lib/action_view/helpers/csrf_helper.rb:9:in `csrf_meta_tag'
app/views/layouts/application.html.erb:5:in `_app_views_layouts_application_html_erb___1820392644171111615_2183801660__2538292988913059192'

Я пытался закомментировать "protect_from_forgery" в моем ApplicationController, но это ничего не делает,И я также попытался закомментировать csrf_meta_tag, который, когда я комментирую в сочетании с удалением form_tag, позволяет отображать действие.

Чтобы отладить это, я попытался сделать мой взгляд максимально простым:

<div>
<h1>This is a Header</h1>

<%= form_tag do %>
  Form contents
<% end %>
</div>

И мой контроллер выглядит следующим образом:

class TeamsController < ApplicationController
  before_filter :authenticate_user!
  check_authorization
  load_and_authorize_resource

  def new
    @team = Team.new
  end
end

Соответствующие гемы, которые я пытаюсь использовать: Devise, Cancan и Rails 3.0.5

Изменить: мой дамп сеанса выглядит следующим образом -

_csrf_token: "iZRWhye/WBrzjWbKreJVIRpfTbfpbSaaJu3fMiW3wEg="
flash: {:notice=>"Signed in successfully."}
session_id: "85fc7d152a17ca884f5b299f4cde926b"
warden.user.user.key: ["User", [1], "$2a$10$KC66DL1T.71ERw4d4VHVq."]
warden.user.user.session: {"last_request_at"=>2011-08-02 22:03:57 UTC}

1 Ответ

0 голосов
/ 03 августа 2011

Поместите это в ваше представление и вставьте вывод:

<code><pre>
<%= method(:session)  %>
<%= instance_variable_get(:@controller).method(:session) %>
<%= instance_variable_get(:@controller).instance_variable_get(:@_request).session.inspect %>

Если ваш контроллер называется HomeController, вы увидите что-то вроде этого:

#<Method: #<Class:0x1cc12fc>(ActionView::Base)#session>
#<Method: HomeController(ActionController::Metal)#session>
{"_csrf_token"=>"R4KKC1hDCzY5hUcIks1xIUonEpywlhjKqjJS7J1gCOk=", "session_id"=>"886b4f181bdc955250424858f45887ad"}

Возможно, что-то изменило метод сеанса в какой-то момент в цепочке делегирования.

...