form_for: nil:NilClass 的未定义方法“新”

form_for: undefined method `new' for nil:NilClass

一切正常,但我刚刚通过 bundle update 更新了 gem,现在我的 /register 页面显示错误:

NoMethodError in Users#new_signup
undefined method `new' for nil:NilClass

错误在视图中的 form_for 行。 这是 users_controller 的操作:

def new_signup
  @user = User.new
  @user.practice = Practice.new
  render :layout => 'login'
end

这是视图 new_signup.html.erb:

<h1>Sign Up</h1>
<%= form_for @user, url: '/register' do |f| %>
  ...
<% end %>

澄清一下,users_controller 中的 new_signup 动作指向 routes.rb 中的 /register url:

Rails.application.routes.draw do
  get 'register', to: 'users#new_signup', as: 'register'
  post 'register', to: 'users#create_signup'
  ...
end

这有什么问题吗?我什至可以调试什么? 我试过将 form_for 更改为 form_for User.new url: '/register' do |f| 没有帮助。

我已经完成了一个 abort @user.inspect,其中 returns 我模型中所有字段的空散列..这似乎是它 应该 输出。

这是 bundle update 的输出:

$ bundle update
Fetching gem metadata from https://rubygems.org/............
Resolving dependencies...
Installing rake 10.4.2 (was 10.3.2)
Installing i18n 0.7.0 (was 0.6.11)
Installing json 1.8.2 (was 1.8.1)
Installing minitest 5.5.1 (was 5.4.2)
Using thread_safe 0.3.4
Using tzinfo 1.2.2
Using activesupport 4.1.1
Using builder 3.2.2
Using erubis 2.7.0
Using actionview 4.1.1
Using rack 1.5.2
Installing rack-test 0.6.3 (was 0.6.2)
Using actionpack 4.1.1
Using mime-types 1.25.1
Using polyglot 0.3.5
Using treetop 1.4.15
Using mail 2.5.4
Using actionmailer 4.1.1
Using activemodel 4.1.1
Using arel 5.0.1.20140414130214
Using activerecord 4.1.1
Using encryptor 1.3.0
Using attr_encrypted 1.3.3
Installing bcrypt 3.1.9 (was 3.1.7)
Using bundler 1.7.3
Using chronic 0.10.2
Using coffee-script-source 1.8.0
Installing execjs 2.2.2 (was 2.2.1)
Using coffee-script 2.3.0
Using thor 0.19.1
Using railties 4.1.1
Using coffee-rails 4.0.1
Installing hashie 3.3.2 (was 3.3.1)
Using hike 1.2.3
Using multi_json 1.10.1
Installing jbuilder 2.2.6 (was 2.2.1)
Using jquery-rails 3.1.2
Installing pg 0.18.1 (was 0.17.1)
Using tilt 1.4.1
Installing sprockets 2.12.3 (was 2.11.0)
Installing sprockets-rails 2.2.2 (was 2.1.4)
Using rails 4.1.1
Installing rdoc 4.2.0 (was 4.1.2)
Using sass 3.2.19
Installing sass-rails 4.0.5 (was 4.0.3)
Installing valuable 0.9.9 (was 0.9.8)
Installing schema_plus 1.8.4 (was 1.6.0)
Using sdoc 0.4.1
Installing spring 1.2.0 (was 1.1.3)
Installing turbolinks 2.5.3 (was 2.4.0)
Installing uglifier 2.7.0 (was 2.5.3)
Using whenever 0.9.4
Updating files in vendor/cache
  * rake-10.4.2.gem
  * i18n-0.7.0.gem
  * json-1.8.2.gem
  * minitest-5.5.1.gem
  * rack-test-0.6.3.gem
  * bcrypt-3.1.9.gem
  * execjs-2.2.2.gem
  * hashie-3.3.2.gem
  * jbuilder-2.2.6.gem
  * pg-0.18.1.gem
  * sprockets-2.12.3.gem
  * sprockets-rails-2.2.2.gem
  * rdoc-4.2.0.gem
  * sass-rails-4.0.5.gem
  * valuable-0.9.9.gem
  * schema_plus-1.8.4.gem
  * spring-1.2.0.gem
  * turbolinks-2.5.3.gem
  * uglifier-2.7.0.gem
Removing outdated .gem files from vendor/cache
  * spring-1.1.3.gem
  * uglifier-2.5.3.gem
  * json-1.8.1.gem
  * rake-10.3.2.gem
  * schema_plus-1.6.0.gem
  * pg-0.17.1.gem
  * rack-test-0.6.2.gem
  * sass-rails-4.0.3.gem
  * turbolinks-2.4.0.gem
  * execjs-2.2.1.gem
  * bcrypt-3.1.7.gem
  * hashie-3.3.1.gem
  * i18n-0.6.11.gem
  * rdoc-4.1.2.gem
  * minitest-5.4.2.gem
  * valuable-0.9.8.gem
  * jbuilder-2.2.1.gem
  * sprockets-2.11.0.gem
  * sprockets-rails-2.1.4.gem
Your bundle is updated!

更新 1:

我按照下面的 尝试通过控制台创建用户。这工作正常,但通过 URL 的错误仍然存​​在。

更新二:

仍然没有运气。我已经安装了 Better Errors,并且正在查看 Full Stack Trace。错误似乎在 form_for 帮助器中,因为它试图为用户 class 实例化表单,它认为它没有 new 方法。

既然@user实例变量已经是User的一个新实例,那么它没有new方法不是很合理吗?

我已将跟踪转储到 JSFiddle 中(显然链接随后不可点击,因此我为完整跟踪的前 3 项创建了 fiddle):

图格斯,

您的代码看起来不错,它应该是一个危险信号,它之前可以正常工作,而不是在更新您的 Gemfile.lock 之后。您的错误表明用户 ActiveRecord 对象有问题。

我会做的事情:

1.) 终止您的本地服务器并重新启动它。有时事情变得很奇怪;重新开始。

2.) 检查您的 schema.rb。它是否包含您期望的所有表格和列?

3.) 打开 rails c 并键入用户。你在你的 schema.rb 中得到它对应的字段了吗?如果没有,您需要启动与数据库的连接。

4.) 尝试创建一个用户。使用 bang 方法 User.create!(required_attributes_here) 这将提供很好的回溯。我希望它会失败。

5.) 你用的是什么数据库?检查控制台中的数据库,确保数据库名称与 database.yml 文件中的名称相匹配。

6.) 如果可以的话,做一个耙子db:yolo; IE。 rake db:drop、rake db:create、rake db:migrate、rake db:seed(最后一个是可选的)。

希望这可以给你进一步clues/solve问题。

我想,这都是关于 form_for 帮手的。 尝试将 url 显式设置为路径,例如:

<%= form_for @user, url: signup_path, html: { method: :post } do |f| %>

并编辑 routes.rb:

post 'register', to: 'users#create_signup', as: 'signup'

希望对您有所帮助。

错误是在您尝试加载 /register 页面时出现还是在提交时出现?

错误是由于我的 gemfile 设置造成的。

Rails "locked" 到版本 4.1.1 而其他 gem 可以免费更新到他们想要的任何版本。

正在更新我的 gemfile,因此使用的 Rails 版本为 4.1.9 并重新启动应用程序已解决问题。