路由错误未定义的局部变量或方法`with'用于ApplicationController:Class

时间:2013-09-09 23:21:18

标签: ruby-on-rails ruby-on-rails-4

我对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

2 个答案:

答案 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的变量/方法中命名。