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):
- form_helper#instantiate_builder: http://jsfiddle.net/tz4he49d/embedded/result/
form_for: http://jsfiddle.net/Lu2fd6u0/embedded/result/
- 用户#new_signup:http://jsfiddle.net/z217ueqj/embedded/result/(下图)
图格斯,
您的代码看起来不错,它应该是一个危险信号,它之前可以正常工作,而不是在更新您的 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 并重新启动应用程序已解决问题。
一切正常,但我刚刚通过 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:
我按照下面的
更新二:
仍然没有运气。我已经安装了 Better Errors,并且正在查看 Full Stack Trace。错误似乎在 form_for
帮助器中,因为它试图为用户 class 实例化表单,它认为它没有 new
方法。
既然@user
实例变量已经是User的一个新实例,那么它没有new
方法不是很合理吗?
我已将跟踪转储到 JSFiddle 中(显然链接随后不可点击,因此我为完整跟踪的前 3 项创建了 fiddle):
- form_helper#instantiate_builder: http://jsfiddle.net/tz4he49d/embedded/result/
form_for: http://jsfiddle.net/Lu2fd6u0/embedded/result/
- 用户#new_signup:http://jsfiddle.net/z217ueqj/embedded/result/(下图)
图格斯,
您的代码看起来不错,它应该是一个危险信号,它之前可以正常工作,而不是在更新您的 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 并重新启动应用程序已解决问题。