【问题标题】:Creating children records: undefined method `model_name' for NilClass:Class创建子记录:NilClass:Class 的未定义方法“model_name”
【发布时间】:2013-02-27 03:54:25
【问题描述】:

当我访问我的一个控制器的“新”操作时,我遇到了可怕的错误:“NilClass:Class 的未定义方法 `model_name'”。当我访问 /works/new 时发生错误。一个用户 has_many 作品。这是 Works 控制器:

class WorksController < ApplicationController

  def index
    @works = Work.all

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @works }
end

def create
@work = current_user.works.build(params[:works])
    if @work.save
      redirect_to root_url
    else
      render 'home'
    end
  end

def new
  @work = Work.new
end

def destroy
  @work.destroy
  redirect_to root_url
end

end
  def show
    @work = Work.find(params[:id])
    @user = User.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @work }
    end
  end
end

在 new.html.erb 视图文件中,我使用以下循环创建一个表单,以便提交填写的字段将为用户创建一个新的工作记录:

 <%= form_for(@work) do |f| %>

我感觉这是错误的根源,因为我没有告诉 Rails 在创建新工作时考虑到用户关系。假设这是问题所在,我是否正确?如果是这样,我该如何解决上述循环?

【问题讨论】:

  • 您说您正在使用“以下循环”,但我没有看到循环。您是忘记粘贴一些代码还是您的意思是“阻止”?
  • 对不起,你是对的。我的意思是输入“block”!

标签: ruby-on-rails class methods ruby-on-rails-3.2


【解决方案1】:

我建议更改您的新方法,以便将 Work 对象的范围限定为当前用户。不过我不确定这是你的问题...

def new
  @work = current_user.works.new
end

更新:

看起来您的方法定义在控制器中搞砸了。 createnewdestroy 实际上是在您的 index 方法中定义的。您需要将位于show 方法正上方的end 移动到create 方法正上方。

【讨论】:

  • 感谢您的回复!这是个好主意,但不幸的是我仍然收到错误消息。但是,我确信进行此更改可以使我免于将来出现错误!
  • 堆栈跟踪是否显示该行是导致问题的行?
  • 堆栈跟踪显示视图中的这一行导致错误:
  • 刚刚发布了我的问题的更新,看起来像是语法问题。
猜你喜欢
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多