forms中的第一个参数不能包含nil或者是空的Hartl的Rails 4教程

我正在研究Michael Hartl的Rails教程,我在第7.3.3节遇到了一个问题。 我收到此错误消息:

ArgumentError in Users#new Showing /Users/Anuraag/rails_projects/sample_app/app/views/users/new.html.erb where line #6 raised: First argument in form cannot contain nil or be empty 

当我运行以下rspec:

 bundle exec rspec spec/requests/user_pages_spec.rb -e "signup with invalid information" 

在以下行:

  

这是我的代码。 如果我没有把它搞清楚,请告诉我如何改进这个问题:我对StackOverflow也很陌生

应用程序/视图/用户/ new.html.erb:

  

Sign up

应用程序/资产/控制器/ users_controller.rb:

 class UsersController < ApplicationController def show @user = User.find(params[:id]) end def create @user = User.new(user_params) if @user.save # Handle a successful save. else render 'new' end end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end end 

规格/请求/ user_pages_spec.rb

 require 'spec_helper' describe "User pages" do subject { page } describe "signup page" do before { visit signup_path } it { should have_content('Sign up') } it { should have_title(full_title('Sign up')) } end describe "profile page" do let(:user) { FactoryGirl.create(:user) } before { visit user_path(user) } it { should have_content(user.name) } it { should have_title(user.name) } end describe "signup" do before { visit signup_path } let(:submit) { "Create my account" } describe "with invalid information" do it "should not create a user" do expect { click_button submit }.not_to change(User, :count) end end describe "with valid information" do before do fill_in "Name", with: "Example User" fill_in "Email", with: "user@example.com" fill_in "Password", with: "foobar" fill_in "Confirmation", with: "foobar" end it "should create a user" do expect { click_button submit }.to change(User, :count).by(1) end end end end 

new.html.erb您指定了form_for(@user) ,这意味着在调用new操作之前,您需要在实例变量@user拥有一些值。

您可以通过两种方式完成此操作:

一种方法是在控制器中定义一个new的动作,在渲染new.html.erb布局之前调用该动作。 例如:

 def new @user = User.new end 

另一种方式是在你的表单本身你可以指定类似的东西

 <%= form_for(User.new) do |f| %> 

new操作中定义它是更标准的方法。

控制器文件中的操作顺序很重要。 我有同样的错误,直到我找出行动方法的顺序问题。 例。 控制器文件

 def edit @post = Post.find(params[:id]) end def update end private def post_params params.require(:post).permit(:title, :body) end 

我正在处理编辑操作,并且遇到了与您相同的错误。 问题是我在私人行动下编写了编辑行动。 一旦我改变了这个行动的顺序。 它就像一个魅力。

我想要实现的目标是什么? 我试图获取post实例变量的值并将其用于html表单。

我没有看到你控制器上的新动作。

 def new @user = User.new end 

我可能间接地做过,但是不能自己定义它。 从你的标题可能是@user变量为零的原因,它没有定义。