首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hartl教程第9章。"ArgumentError in UsersController#edit“

Hartl教程第9章。"ArgumentError in UsersController#edit“
EN

Stack Overflow用户
提问于 2015-05-22 16:30:26
回答 2查看 275关注 0票数 0

我对Ruby和Rails完全陌生,并且正在学习Hartl教程。我在谷歌上搜索了这个错误,并想出了几个类似的问题(比如thisthis),但是发给他们的解决方案对我没有帮助。

根据教程说明,我的UsersController如下所示:

代码语言:javascript
复制
class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end

  def edit
    @user = User.find(params[:id])
  end
.
.
.

因此,此时,showedit操作是相同的。show操作运行良好(即它显示了有关@user的预期信息)。但是,在edit链接之后会出现以下错误:

代码语言:javascript
复制
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',上面说

代码语言:javascript
复制
Parameters:
{"id"=>"1"}

..。这似乎意味着正在传递参数,但出于某种原因,没有从数据库中检索@user对象。

我尝试用edit.html.erb交换show.html.erb的内容,结果是show页面现在正确地显示了编辑表单,edit链接(现在包含show页面,以前工作得很好)抛出了一个错误,因为它坚信@user对象是零。

任何帮助/见解都将不胜感激。

编辑:我真的认为我已经排除了这个错误的可能来源,但是为了完整起见,这是edit表单代码:

代码语言:javascript
复制
<% 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行更改为:

代码语言:javascript
复制
    <%= form_for(@user = User.find(params[:id])) do |f| %>

..。然后,它正确地呈现页面。尽管它没有回答更深层次的问题:“为什么没有这个丑陋的黑客,它就不能工作。”

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-23 04:00:09

嗯,我找到了答案,就像你想象的那样愚蠢。我不小心阅读。我没有意识到editupdate是两个独立的操作:上面第一个代码块中标记为def edit的控制器实际上被标记为def update,而且我一直将其读为edit

所以,感谢所有看过它的人,尤其是spectre6000,它的链接让我花了更长的时间看控制器,并为浪费您的时间表示诚挚的歉意。

从好的方面来说,我认为在过去的六个小时里,我对Rails的了解比在本教程的前两个星期中了解得更多。

票数 0
EN

Stack Overflow用户

发布于 2015-05-22 18:45:07

视图的交换就像它们一样,因为showedit路由有差异。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)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30401717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档