我对Ruby和Rails完全陌生,并且正在学习Hartl教程。我在谷歌上搜索了这个错误,并想出了几个类似的问题(比如this和this),但是发给他们的解决方案对我没有帮助。
根据教程说明,我的UsersController如下所示:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
def edit
@user = User.find(params[:id])
end
.
.
.因此,此时,show和edit操作是相同的。show操作运行良好(即它显示了有关@user的预期信息)。但是,在edit链接之后会出现以下错误:
ArgumentError in UsersController#edit
First argument in form cannot contain nil or be empty
Extracted source (around line #432):
else
object = record.is_a?(Array) ? record.last : record
raise ArgumentError, "First argument in form cannot contain nil or be empty" unless object
object_name = options[:as] || model_name_from_record_or_class(object).param_key
apply_form_for_options!(record, object, options)
end在错误页面的下方,有一个标题'Request',上面说
Parameters:
{"id"=>"1"}..。这似乎意味着正在传递参数,但出于某种原因,没有从数据库中检索@user对象。
我尝试用edit.html.erb交换show.html.erb的内容,结果是show页面现在正确地显示了编辑表单,edit链接(现在包含show页面,以前工作得很好)抛出了一个错误,因为它坚信@user对象是零。
任何帮助/见解都将不胜感激。
编辑:我真的认为我已经排除了这个错误的可能来源,但是为了完整起见,这是edit表单代码:
<% provide(:title, "Edit user") %>
<h1>Update your profile</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_for(@user) do |f| %>
<%= render 'shared/error_messages' %>
<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>
<%= f.label :email %>
<%= f.email_field :email, class: 'form-control' %>
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>
<%= f.label :password_confirmation, "Confirmation" %>
<%= f.password_field :password_confirmation, class: 'form-control' %>
<%= f.submit "Save changes", class: "btn btn-primary" %>
<% end %>
<div class="gravatar_edit">
<%= gravatar_for @user %>
<a href="http://gravatar.com/emails" target="_blank">change</a>
</div>
</div>
</div>编辑:我尝试将表单代码的第6行更改为:
<%= form_for(@user = User.find(params[:id])) do |f| %>..。然后,,它正确地呈现页面。尽管它没有回答更深层次的问题:“为什么没有这个丑陋的黑客,它就不能工作。”
发布于 2015-05-23 04:00:09
嗯,我找到了答案,就像你想象的那样愚蠢。我不小心阅读。我没有意识到edit和update是两个独立的操作:上面第一个代码块中标记为def edit的控制器实际上被标记为def update,而且我一直将其读为edit。
所以,感谢所有看过它的人,尤其是spectre6000,它的链接让我花了更长的时间看控制器,并为浪费您的时间表示诚挚的歉意。
从好的方面来说,我认为在过去的六个小时里,我对Rails的了解比在本教程的前两个星期中了解得更多。
发布于 2015-05-22 18:45:07
视图的交换就像它们一样,因为show和edit路由有差异。show路由是user/:id,其中edit路由是user/:id/edit,它需要一个表单。
http://guides.rubyonrails.org/routing.html (参见2.2CRUD、谓词和动作)
我将非常仔细地查看您的edit视图表单,甚至可能尝试从Hartl清单9.2中复制/粘贴,以找到一个特别难以捉摸的错误。
raise ArgumentError, "First argument in form cannot contain nil or be empty" unless object建议对象是不真实的(也就是nil)。
https://stackoverflow.com/questions/30401717
复制相似问题