用于NilClass的未定义方法`model_name':Class - Rails应用程序

时间:2012-09-05 15:36:28

标签: ruby-on-rails ruby forms

所以我在堆栈上看到过关于此的其他文章,很多时候人们没有做@post = post.new。我读了一些使用复数的地方...... ??

我在讨论代码中出现此错误的任何方式:

模型

class Discussion < ActiveRecord::Base
  has_many :comment
  belongs_to :author
  attr_accessible :author_id, :content, :title

  validate :comment, :presence => true
  validate :title, :presence => true
end

讨论控制器

class DiscussionsController < ApplicationController
  def index
    @discussion = Discussion.new
    @discussions = Discussion.all
  end

  def create
    @discussion = Discussion.create(params[:discussion])
    if @discussion.save
      redirect_to tasks_path, :flash => {:success => 'Created a new discussion'}
    else
      redirect_to tasks_path, :flash => {:error => 'Failed to create a discussion'}
    end
  end
end

讨论表格

<%= form_for @discussion do |f| %>

    <p><%= f.label :title %>
    <%= f.text_field :title %></p>

    <p><%= f.label :content %>
    <%= f.text_area :content %></p>

<% end %>

讨论路线

  resources :discussions do
    resources :comments
  end

据我所知,我这样做是正确的,因为我有一个基本相同的任务形式设置 - 但我已经看了几个小时我的代码并搜索了其他示例,现在我看到了这个:

undefined method `model_name' for NilClass:Class

Extracted source (around line #1):

1: <%= form_for @discussion do |f| %>
2: 
3:  <p><%= f.label :title %>
4:  <%= f.text_field :title %></p>

这应该意味着我从控制器中遗漏了一些东西.....它是否像拼写错误一样? &GT;&GT;

5 个答案:

答案 0 :(得分:1)

您是否尝试过将其放入讨论控制器?

def new
  @discussion = Discussion.new
end

答案 1 :(得分:0)

你必须添加:method =&gt; :发布到用于创建对象的表单,否则表单将通过GET请求提交。

<%= form_for @discussion , :method => :post do |f| %>

答案 2 :(得分:0)

我认为您的问题是您正在尝试在任务表单上创建讨论,但只定义了讨论控制器而不是任务控制器。

答案 3 :(得分:0)

具有form_for的索引视图吗?

如果没有,那么您应该向控制器添加操作,并在那里执行@discussion = Discussion.new而不是索引操作。

答案 4 :(得分:0)

如果您的模型关系与您提供的完全一致,那么它们是不正确的

class Discussion < ActiveRecord::Base
  has_many :comment #has_many :comments
  belongs_to :author
  attr_accessible :author_id, :content, :title

  validate :comment, :presence => true #valide :comments, :presence => true
  validate :title, :presence => true
end