Ruby on rails 表单中的第一个参数不能包含nil或为空Hartl';s Rails 4教程
我正在学习Michael Hartl的Rails教程,在第7.3.3节中遇到了一个问题。我收到此错误消息:Ruby on rails 表单中的第一个参数不能包含nil或为空Hartl';s Rails 4教程,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On 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时:
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"
在以下行:
<%= form_for(@user) do |f| %>
我看不到你身上有什么新动作
def new
@user = User.new
end
我可能是间接的,但这不会伤害你自己定义它。
从你的标题来看,这可能就是@user变量为nil的原因,它没有定义。在你的
new.html.erb
中,你已经为(@user)指定了表单,这意味着在调用new
操作之前,你需要在实例变量@user
中有一些值
您可以通过两种方式完成:
一种方法是在控制器中定义一个动作new
,在呈现new.html.erb
布局之前调用该动作。例如:
def new
@user = User.new
end
另一种方式是,在表单本身中,您可以指定如下内容
<%= form_for(User.new) do |f| %>
在新操作中定义它是更标准的方法。控制器文件中的操作顺序很重要。我也犯了同样的错误,直到我解决了关于动作顺序方法的问题。
例子。
控制器文件
def edit
@post = Post.find(params[:id])
end
def update
end
private
def post_params
params.require(:post).permit(:title, :body)
end
我正在进行编辑操作,得到了与您相同的错误。问题是我已经在私人行动下编写了编辑行动。一旦我改变了这个动作的顺序。它就像一个符咒
我想要达到的目标是什么?
我试图获取post实例变量的值并将其用于html表单 您收到的错误消息是什么?另外,你可以发布rspec的例子吗?我做了你要求的编辑。你现在有什么见解了吗?我以为我的“添加创建”块解决了这个问题…?什么是“添加创建”?在控制器中?在用户/new.html.erb视图之后使用。您确实需要在控制器中执行新操作。或者Deavise处理该操作,但在代码上方尝试,它应该可以消除零错误。为什么Deavise会在OP实际使用其自己的控制器时处理它UsersController
感谢kirti给出相同的答案。但是请注意,它没有在控制器中出错,给出了一个未定义的新动作,因此,有东西正在间接地创建它,它可能是rails、cancan、Desive或其他一些gem。我的创建动作以及控制器中的私有用户参数定义不是代替了新动作吗?你能看一下我正在学习的Rails教程吗?在第7.3.3节中,请查看清单7.18
,其中为用户控制器
定义了新
操作。我想你错过了。谢谢!:)你能解释一下为什么你需要这个动作和我的后续代码吗?对我来说这似乎是多余的。请阅读new
中的CRUD,它是一个呈现new.html.erb
视图的操作,而create
是一个通过new.html.erb
提交POST请求时调用的操作。您好,当我试图添加带有显示错误的表单时,例如:ArgumentError in Pages#about:表单中的第一个参数不能包含nil或为空。这是什么,因为我是ROR的新手这里是我的表格
def new
@user = User.new
end
<%= form_for(User.new) do |f| %>
def edit
@post = Post.find(params[:id])
end
def update
end
private
def post_params
params.require(:post).permit(:title, :body)
end