我对rails很新,我无法弄清楚为什么我会收到此错误:
undefined local variable or method `with' for ApplicationController:Class
路由:
root 'home#index'
控制器:
class HomeController < ApplicationController
def new
end
def index
end
end
app trace:
app/controllers/application_controller.rb:4:in `<class:ApplicationController>'
app/controllers/application_controller.rb:1:in `<top (required)>'
app/controllers/home_controller.rb:1:in `<top (required)>'
我已经更新了一些模型和rspec代码来测试模型验证,但除此之外我没有创建其他控制器/视图/路由等。
注意:ruby 2.0.0,rails 4.0.0
应用程序控制器:
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with::exception
end
也许这是一些奇怪的宝石?
的Gemfile:
source 'https://rubygems.org'
ruby '2.0.0'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
gem 'rails', '4.0.0'
group :development do
gem 'sqlite3', '1.3.7'
gem 'rspec-rails', '2.14.0'
gem 'guard-rspec', '3.0.2'
gem 'guard-spork', '1.5.1'
gem 'factory_girl', '4.2.0'
gem 'factory_girl_rails', '4.2.1'
end
gem 'mysql', '2.9.1'
gem 'mysql2', '0.3.13'
gem 'sass-rails', '4.0.0'
gem 'uglifier', '2.1.1'
gem 'coffee-rails', '4.0.0'
gem 'jquery-rails', '2.2.1'
gem 'turbolinks', '1.1.1'
gem 'jbuilder', '1.2'
group :test do
gem 'email_spec', '1.5.0'
#gem 'selenium-webdriver', '2.0.0'
#gem 'capybara', '2.1.0'
end
group :doc do
gem 'sdoc', '0.3.20', require: false
end
答案 0 :(得分:3)
看起来你需要第4行的空间。
所以
protect_from_forgery with::exception
变为:
protect_from_forgery with: :exception
原因是protect_from_forgery是一种将哈希作为唯一参数的方法。
答案 1 :(得分:2)
ApplicationController
中的语法已关闭。 Ruby 1.9.3语法规定,当值为符号时,空格必须将键及其值分开:
# apps/controllers/application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
end
另一种方法是使用传统的哈希火箭语法:
protect_from_forgery :with => :exception
<强>更新强>:
protect_from_forgery with::exception
的问题源于protect_from_forgery
期望哈希作为其参数的事实。但是,在Ruby中,双冒号::
表示命名空间。基本上,ActionController
认为with::exception
是名为exception
的变量/方法,它在名为with
的变量/方法中命名。